不,“新”代码在重循环中使用时效率较低。
您可以使用数组来模拟 StringBuffer。
<cfset var buffer = ArrayNew(1)>
<cfset ArrayAppend(buffer, variables.myVar1)>
<cfset ArrayAppend(buffer, variables.myVar2)>
<!--- more of these --->
<cfset result = ArrayToList(buffer, "")>
但是:如果您不连续连接数百或数千个字符串,则使用 StringBuffer 几乎没有什么好处。你可以去&
在多数情况下。
我已经做了一些测试(在带有 Java 1.4 的 ColdFusion 7 服务器上,较新的版本可能得分不同)。
所有时间均以毫秒为单位。结果是 10 次重复的平均值(方括号中的那个除外,因为这实际上需要很长时间)。
以下是迭代连接的测量一个字母N次。
iterations concat array cfsave string
content buffer
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
content buffer
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)
,例如),然后在空间用完时被迫重新分配更多空间,这也需要时间。为了进行测试,我用它所需的空间量对其进行了初始化。