可以用ColdFusion中的“常规”字符串操作逻辑替换java.lang.StringBuffer吗?
我不是Java专家; 我希望这个名单上有更多精通Java的人可以帮助我。
我当前的服务器上有以下代码。
我试图将这些代码移动到另一台服务器。 问题是这个新服务器(共享主机)不允许调用Java对象。 所以,我把它们改成了以下几点。
我的问题是,新代码是否与旧代码相当? 使用java.lang.StringBuffer有什么好处?
在此先感谢,Monte
不,当在重循环中使用时,“新”代码效率较低。
您可以使用数组模拟StringBuffer。
但是:如果您没有连续连接数百或数千个字符串,那么使用StringBuffer几乎没有任何好处。 在大多数情况下,您可以使用&
。
我做了一些测试(在Java 1.4的ColdFusion 7服务器上,更新的版本可能得分不同)。
所有时间都是毫秒。结果平均超过10次重复(除了方括号中的一个,因为这几乎是永远的)。
以下是迭代连接单个字母 N次的测量。
iterations concat array cfsave string 内容缓冲区 100 0 0 0 2 1000 4 4 2 22 10000 168 29 33 219 100000 30,781 168 293 1,575
以下是迭代连接长度为10 N次的字符串的结果:
iterations concat array cfsave string 内容缓冲区 100 0 0 0 4 1000 25 0 2 24 10000 1,242 33 31 232 100000 [410,979] 180 373 2,082
请注意,基本字符串连接如何变得越来越低效,您执行的迭代越多,字符串越长。 其他方法显示更多的线性行为。
进一步注意StringBuffer的性能也与其初始大小有关。 如果你将它的尺寸设置得太小(例如通过调用init("")
而不是.init(10000)
,那么当它用完时它会被迫重新分配更多的空间,这也需要时间。 为了测试,我用它所需的空间量初始化它。
从技术上讲,没有。 但实际上,我认为这很好。
StringBuffer是一个可变对象,因此你可以追加()。 ColdFusion字符串(如Java字符串)是不可变的,因此您需要创建一个新字符串并覆盖旧字符串(这是您在上面的示例中所做的)。
我不确定,但你可能会看到一个小的(毫秒)性能不同,从技术上讲,你使用ColdFusion方法创建更多的对象,但由于你使用的是共享托管,你可能并不真正关心这种性能不管怎么说。
除非你做了数百或更多这些,否则我怀疑你会发现有什么不同。
在
使用
。 如果您构建的内容对空间敏感,请将输出加倍以获得额外的空格/换行符,并相应地编码
和
(即在一行中)。
我来过交叉测试,certificate它比Java的StringBuilder
更快。
更新: http : //www.cfinsider.com/index.cfm/2009/10/23/High-Performance-String-Concatenation-in-ColdFusion
从最快到最慢:
- ArrayAppend()然后是ArrayToList()
-
- StringBuilder的追加()
- 使用
&
基本字符串concat