我不是Java专家;我希望这份名单上有更多精通Java的人可以帮助我。
我当前的服务器上有以下代码。
<cfset var buffer = CreateObject("java", "java.lang.StringBuffer").init("") />
<cfset buffer.append(variables.myVar) />
我正在尝试将这些代码移到另一台服务器上。问题是这个新服务器(共享主机)不允许调用Java对象。所以,我将它们更改为以下内容。
<cfset var buffer = "" />
<cfset var buffer = buffer & variables.myVar />
我的问题是,新代码是否与旧代码相同?使用java.lang.StringBuffer有什么好处?
提前致谢, 蒙
答案 0 :(得分:6)
不,在重循环中使用时,“新”代码效率较低。
您可以使用数组模拟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)
)那么它在用完时会被迫重新分配更多的空间,这也需要时间。为了测试,我用它所需的空间量初始化它。
答案 1 :(得分:2)
从技术上讲,没有。但实际上,我认为这很好。
StringBuffer是一个可变对象,因此你能够追加()。 ColdFusion字符串(如Java字符串)是不可变的,因此您需要创建一个新字符串并覆盖旧字符串(这是您在上面的示例中所做的)。
我不确定,但你可能会看到一个小的(毫秒)性能不同,从技术上讲,你使用ColdFusion方法创建更多的对象,但是由于你使用共享托管,你可能并不真正关心无论如何,这种性能差异。
除非您正在进行数百或更多这些,否则我怀疑您会发现有什么不同。
答案 2 :(得分:1)
在<cfloop>
内使用<cfsavecontent>
。如果您构建的内容对空间非常敏感,请将输出加倍以获得额外的空格/换行符,并相应地对<cfloop>
和<cfsavecontent>
进行编码(即在一行中)。
我已经进行了交叉测试,证明它比Java的StringBuilder
更快。
更新: http://www.cfinsider.com/index.cfm/2009/10/23/High-Performance-String-Concatenation-in-ColdFusion
从最快到最慢:
<cfsavecontent>
&