可以用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

从最快到最慢:

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