java.lang.StringBuffer可以被ColdFusion中的“常规”字符串操作逻辑替换吗?

时间:2011-06-06 15:36:24

标签: java coldfusion

我不是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有什么好处?

提前致谢, 蒙

3 个答案:

答案 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

从最快到最慢:

  1. ArrayAppend(),然后是ArrayToList()
  2. <cfsavecontent>
  3. StringBuilder的追加()
  4. 使用&
  5. 的基本字符串concat