使用Rope来高效处理长字符串
前段时间看了这篇文章《Ropes:理论与实践》。这两天为了提高工作中某个系统对外接口的效率,才认真学习了一番。本质上Ropes是将字符串表示为一棵二叉树,特别适用于长字符串的处理,貌似c++ STL库中也有这么个实现。具体实现和原理还是看这篇paper。《Ropes:理论与实践》一文中给出的测试数据相当惊人,Ropes比之String和StringBuffer在append,insert,delete等操作上的效率都有一个数量级以上的差距。跑下作者给出的测试程序,其实在测试的字符串不是很长的情况下,这个差距并没有那么大,这也从侧面说明了Rope的应用范围:即只有在大量修改大型字符串的应用程序中才能看到明显的性能提升。那么是否可以用Rope替代StringBuffer做append生成字符串(比如我要的生成xml)。作者也说啦:
“由于 Rope
的附加性能通常比 StringBuffer
好,这时使用 rope 是否有意义呢?答案还是否。不论何时将输入的数据组合在一起形成格式化输出时,最漂亮最有效的方法是使用模板引擎(例如 StringTemplate 或 FreeMarker)。这种方法不仅能干净地将表示标记与代码分开,而且模板只进行一次编译(通常编译为 JVM 字节码),以后可以重用,从而使它们拥有极佳的性能特征。”
我用Rope for java替代了StringBuffer做XML生成,效率提升在5%-30%左右,xml字符串不是很长,这个提升显然有限,也带来了不必要的复杂度。因此最后还是用Velocity模板引擎来生成XML,测试的结果效率并没有多少改善,但是显然更容易维护和开发了。回到Rope的话题,我用Ruby实现了个版本,Rubyforge上有一个Rope的实现,但是看了源码,与paper所述算法有点差异,因此照着Rope for java也实现了一个Rope4r。测试的结果证明在长字符串的累积操作上,Rope4r的append比之String的+=性能可以快上3倍左右,而如果采用String的<<操作,不是immutable的,当然是最快了;比较郁闷的是slice和insert操作都比String的慢上几倍,因为Ruby的String、Array的内建对象都是直接用c写成并做了优化的,我猜测原因在这。
文章转自庄周梦蝶 ,原文发布时间2008-05-05
相关文章
- 润和Hi3516开发板OpenHarmony小型系统、标准系统烧录
- 【FFH】小熊派驱动调用流程(以调用LED灯驱动为例)
- 服务器性能优化之网络性能优化
- Preset-Env 按需 Polyfill 是怎么实现的?
- Windows不安装虚拟机如何使用Linux系统作为开发工具?
- 一款运行于Windows上的Linux命令神器-Cmder(已经爱不释手)
- Spring认证_什么是Spring GraphQL?
- 跟我学Linux:apt命令快速参考指南
- oeasy教您玩转vim – 11 – # 向前向后
- 谷歌推出 Chrome OS Flex 系统,可将旧电脑变成 Chromebook
- Wine 7.2 发布,Linux下安装使用最新版QQ与微信
- xtrabackup 增量,全备份,恢复备份
- windows 远程桌面连接提示:出现了内部错误,windows远程桌面登录linux闪退
- 基于java springboot垃圾分类小程序源码(毕设)
- oeasy教您玩转vim – 10 – # 插入新行
- golang 系列: mutex 讲解
- 云服务器系统哪个好用吗
- 哈雷推出电动摩托车,超400万元收购品牌域名LiveWire.com
- 直观对比了解Windows 10和Windows 11,才知道最好用的系统是这个
- 至暗时刻,风“云”突变(四):2015到2019,从5到70,从0到100万,技术推动业务的云实践,我创业的这4年