使用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写成并做了优化的,我猜测原因在这。


你可能感兴趣的:(使用Rope来高效处理长字符串)