使用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

时间: 2024-08-14 17:02:05

使用Rope来高效处理长字符串的相关文章

在SQL中获取一个长字符串中某个字符串出现次数的实现方法

以下是对在SQL中获取一个长字符串中某个字符串出现次数的实现方法进行了详细的分析介绍,需要的朋友可以参考下   在SQL中获取一个长字符串中某个字符串出现次数的实现方法 比如有个字符串: X-BGS-2010-09-15-001 我想知道其中'-'出现的次数,可以用下面的方法实现,而不需要复杂的一个个字符分析. declare @a varchar(100) set @a='X-BGS-2010-09-15-001' select len(replace(@a,'-','--'))-len(@a

string-python struct 解封包变长字符串

问题描述 python struct 解封包变长字符串 1C 码友们好,我想实现变长struct的解封包,功能类似下面这样,当然这样还行不通 #一个变长字串s='string data'#在串的前面写入串的长度然后写入串本身buf=struct.pack('i'+str(len(s))+'s' len(s) s)#网路接受...#先读出串的长度,然后按这个长度读出串lss=struct.unpack('i'+str(l)+'s' buf) 在此,先谢谢你的关注,如有指教不胜感激. 解决方案 直接

苹果激活锁功能可被长字符串溢出

苹果手机丢失后,机主可通过云端将手机锁住以防止别人使用.但安全研究人员声称可通过输入长字符串,绕过这个激活锁功能. 苹果用户可通过iCloud"寻找我的iPhone"的激活锁功能将手机锁死,没有口令便无法使用.印度安全公司的一名安全人员 Hemanth Joseph表示,锁机后手机还可以做一些事情,包括连接到手动配置的Wi-Fi网络.于是,Joseph尝试通过输入非常长的用户名和口令字符串(WPA2-Enterprise),来宕掉执行锁屏的服务. 在输入长字符串后屏幕死机,然后使用iP

c-控制台输出长字符串时会自动换行??

问题描述 控制台输出长字符串时会自动换行?? 我的程序如下: #include "stdafx.h" #include using namespace std; int main() { char str[100] = "fhfbhfvhfbvdhbdjfbvhdb -610市场就会恢复的发货速度不变VB 基金的设计简单简单计算机"; cout<<str<<endl; return 0; } 输出时,,str内容会自动换行,,我不想让它换行输

Javascript 中的长字符串拼接

Javascript 中的长字符串拼接 2011-07-11 16:00 佚名 互联昂网  字符串拼接是所有程序设计语言都需要的操作.当拼接结果较长时,如何保证效率就成为一个很重要的问题. C 语言的 strcat 函数直接操作内存,效率自然最高:C++ 的 string 类是可变的,本质上也是直接操作内存,效率也不在话下:Java 的 String 类不可变,字符串拼接意味着产生新对象,因此提供了专门用于字符串拼接的 StringBuffer 类,也保证了执行效率. 在 Javascript

定长字符串的问题

问题描述 项目目前代码dima,basstringa="123456"b=a'此时b为123456------------想要实现定长字符串自动截取功能例dimaasstringdimbasNewMicrosoft.VisualBasic.Compatibility.VB6.FixedLengthString(5)'定义长度5的字符串a="123456"b.value=a'此时b.value=12345-----但问题是这样做需要大量修改现行代码如上面的方法,需要为

求一个c#通用函数,将传入的一个长字符串按规定的长度分几行等长输出

问题描述 求一个c#通用函数,将传入的一个长字符串按规定的长度分几行等长输出 求一个c#通用函数,将传入的一个长字符串按规定的长度分几行等长输出,若遇到百分比范围(如40%~50%)不能拆开,要放在同一行. 数字占一位,汉字是占两位 例如: 若传入这样一个字符串: 今后,江苏联络处在公安部的授权范围内开展工作,接受国际刑警组织中国国家中心局的业务指导,负责20%~30%国际刑警组织框架内的联络工作,统筹全省公安机关22.543%~60%涉外刑事案件的协调组织. 输出: 今后,江苏联络处在公安部的

StringBuffer类比String类更高效地存储字符串还是更高效的追加字符串

问题描述 昨天考试出了这道么一道选择题:其中两个选项,一个是stringbuffer比String更高效的追加字符串,一个是stringbuffer比String更高效的存储字符串,我想问一下正确答案应该是哪个,为什么?谢谢 解决方案 用String存储字符串的话,如果你要追加加字符串,它会在你的内存中重新开辟一块空间来存储,那用StringBuffer的话,它就会在原来的基础上继续追加字符串,不会开辟新的内存空间,所以stringbuffer比String更高效的追加字符串是对的解决方案二:事

用正则,从指定起始位置,在源字符串之中截取定长字符串

[代码]用正则, 从指定起始位置, 在源字符串之中截取定长字符串(含中文)[第四版] [代码]用正则, 从指定起始位置开始, 在源字符串之中截取一定长度的字符串[第四版] [代码]使用正则表达式, 从指定的起始位置开始, 在源字符串之中截取一定长度的字符串[第四次修正] [代码]使用正则表达式, 从字符串头部开始, 在源字符串之中截取一定字节长度的字符串 [代码]使用正则表达式, 从指定的起始位置开始, 在源字符串之中截取一定长度的字符串 (BTW: 中文编码很复杂也有些不合理的地方 高位是 0