输入很大时,字符串连接非常慢

时间:2009-10-08 07:53:52

标签: flash actionscript-3 string concatenation

以下代码之类的东西超级慢:

var str:String = ""
for (var i:Number = 0 ; i<1000000000000000000 ; ++i) {
    str += "someLongLongLongLongLongLongLongLongLongString";
}

Java中有StringBuilder但似乎没有AS的等价物。 那么,你们如何处理大字符串连接?


更新

感谢大家的回答!

我刚刚编写了自己的testing program。使用+=已经是最快的了......什么是慢速将它放在TextArea上......

我已经投票给大多数人,因为建议有意义:)虽然我的测试结果显示我的问题似乎有些问题因为我要求更好的东西然后是最好的:P

5 个答案:

答案 0 :(得分:6)

是的,即使使用StringBuilder 也会很慢。我的问题是:你为什么要创建一个大小为46艾字节的字符串?

在某些时候,更传统的外部存储(即磁盘上)方法成为一个好主意,但你似乎已经通过了这一点(基于今天常用的磁盘阵列)。

我一般都没有这个问题,因为我倾向于不使用字符串来存储这么大的东西。字符串通常用于较小的对象。你在那里有一个相当大的数据仓库,而不是名称或地址字段: - )

答案 1 :(得分:5)

我不能说我对ActionScript有经验,但对于一般的ECMAScript,我发现数组可以帮助加速字符串连接(下面是JavaScript示例):

var sb = [];
for (var i = 0; i < 10000000000; i++) {
    sb.push('longlonglong');
    // In this particular case you can avoid a method call by doing:
    //sb[i] = 'longlonglong';
}
var str = sb.join('');

答案 2 :(得分:2)

两件事通常会使这些操作变得缓慢:

  • 字符串从为其分配的内存中增长,因此必须重新分配。这涉及堆内存管理器,并复制内容。随着内容的增长,这意味着它被复制很多,并且内存系统必须非常努力。
  • 如果字符串的存储方式并不意味着其长度可用作O(1)操作,则串联首先必须遍历整个字符串以查找长度,即从何处开始连接。每个单个连接的均值与目标字符串的长度成比例。

我确信其中至少有一个会打你(后者可能不会,不确定在ActionScript内部如何表示字符串)。

答案 3 :(得分:2)

––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
performancetests.Strings (1 iterations)                                 
Player version: MAC 10,0,32,18 (debug)
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
method...................................................ttl ms...avg ms
stringsWithConcatMethod                                   17555 17555.00
stringsWithPlusConcat                                      4972  4972.00
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

我不是受虐狂,所以我只使用了10000000迭代循环:

var str:String = ""
for (var i:Number = 0 ; i<10000000 ; ++i) {
    str += "someLongLongLongLongLongLongLongLongLongString";
}

var str:String = ""
for (var i:Number = 0 ; i<10000000 ; ++i) {
    str = str.concat("someLongLongLongLongLongLongLongLongLongString");
}

使用Grant Skinner's AS3 Performance Test Harness。 String :: concat方法甚至更慢,但考虑到你的条件as3可能只是懒惰。 (结果中的1次迭代是经过10000000次迭代循环的1次)。我对结果感到非常惊讶。我认为concat会更快。

答案 4 :(得分:2)

你在这里进行类型滥用......:D ...在AVM2上,字符串用于文本表示......它们总是unicode,这就是为什么每个字符需要超过2个字节...所以它们不适合存储i-will-make-your-heap-explode大小的ascii序列...如果你真的想操纵sh * tload的数据,那么去flash.utils::ByteArray ...不是它特别快,但它在语义上更正确,内存占用更少......而且它有本机压缩方法,这是我在你的情况下高度推荐的......:P