数组连接与字符串连接

IT技术 javascript arrays performance join connection-string
2021-02-19 06:11:13

哪种方法更快?

数组连接:

var str_to_split = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
var myarray = str_to_split.split(",");

var output=myarray.join("");

字符串连接:

var str_to_split = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
var myarray = str_to_split.split(",");

var output = "";
for (var i = 0, len = myarray.length; i<len; i++){
    output += myarray[i];
}
6个回答

ECMAScript 中的字符串连接速度更快。这是我创建的一个基准测试:

http://jsben.ch/#/OJ3vo

2018,FF v59,上述链接的结果 -> array join (fastest!)
2021-04-19 06:11:13
更新:我发现了一些重要的事情,1)我们在连接示例中不必要地重新创建数组,2)如果我们存储数组长度以防止在每次迭代时检查长度会更好
2021-04-22 06:11:13
Apples to apples:连接不同长度的字符串 2000 次,或者在数组中构建并执行join,或者使用字符串连接。jsperf.com/yet-another-array-vs-concat Concat 凭借现代引擎的性能赢得了胜利,当然,在可读性/可维护性/可调试性方面总是获胜。当我 10 年前尝试这样做时,数组的性能稍好一些。不再如此。
2021-04-28 06:11:13
@ajax333221:“我们在连接示例中不必要地重新创建数组创建数组以连接它是重点您更新的 jsperf 将苹果与橙子进行了比较。如果你已经有一个数组,是的,join速度更快。但是人们比较的是创建一个数组只是为了加入它,而不是做字符串连接。完全不同的鱼锅。
2021-05-06 06:11:13
我认为 jsben.ch 网站可能有问题。它与来自 jsperf.com 的结果不一致:stackoverflow.com/questions/44612083/...
2021-05-07 06:11:13

从 2011 年到现代......

请参阅以下join使用字符串连接的重写,以及它比标准实现慢多少。

// Number of times the standard `join` is faster, by Node.js versions:
// 0.10.44: ~2.0
// 0.11.16: ~4.6
// 0.12.13: ~4.7
// 4.4.4: ~4.66
// 5.11.0: ~4.75
// 6.1.0: Negative ~1.2 (something is wrong with 6.x at the moment)
function join(sep) {
    var res = '';
    if (this.length) {
        res += this[0];
        for (var i = 1; i < this.length; i++) {
            res += sep + this[i];
        }
    }
    return res;
}

道德是 - 不要手动连接字符串,始终使用标准join.

我遇到了这个话题,其他答案可能在 2011 年是正确的,但此时加入确实更好。
2021-05-05 06:11:13

我可以肯定地说使用 Array.join() 更快。我已经处理了几段 JavaScript 代码,并通过删除字符串操作以支持数组来显着提高性能。

当字符串数组已经存在时,“加入”会更快。真正的比较是比较:

  1. 将元素推入数组,然后加入它们以构建字符串
  2. 每次连接字符串而不使用数组

对于少量的迭代和字符串,使用 push-and-join 还是 concatenate 都没有关系。但是,对于大量字符串,数组推送和连接在 chrome 和 firefox 中似乎都更快

以下是 10 到 1000 万个字符串的代码和测试结果:

铬合金:

strings 10
join-only: 0.01171875 ms
push-join: 0.137939453125 ms
concatenate: 0.01513671875 ms
strings 100
join-only: 0.01416015625 ms
push-join: 0.13427734375 ms
concatenate: 0.0830078125 ms
strings 1000
join-only: 0.048095703125 ms
push-join: 0.47216796875 ms
concatenate: 0.5517578125 ms
strings 10000
join-only: 0.465087890625 ms
push-join: 5.47314453125 ms
concatenate: 4.9619140625 ms
strings 100000
join-only: 7.6240234375 ms
push-join: 57.37109375 ms
concatenate: 67.028076171875 ms
strings 1000000
join-only: 67.666259765625 ms
push-join: 319.3837890625 ms
concatenate: 609.8369140625 ms
strings 10000000
join-only: 824.260009765625 ms
push-join: 3207.129150390625 ms
concatenate: 5959.56689453125 ms

火狐:

strings 10
join-only: 0ms
push-join: 1ms
concatenate: 0ms
strings 100
join-only: 0ms
push-join: 0ms
concatenate: 0ms
strings 1000
join-only: 0ms
push-join: 1ms
concatenate: 0ms
strings 10000
join-only: 1ms
push-join: 2ms
concatenate: 0ms
strings 100000
join-only: 5ms
push-join: 11ms
concatenate: 8ms
strings 1000000
join-only: 39ms
push-join: 88ms
concatenate: 98ms
strings 10000000
join-only: 612ms
push-join: 1095ms
concatenate: 3249ms

测试代码:

for (var n = 10; n <= 10000000; n*=10) {
    
    var iterations = n;

    console.log("strings", iterations);
    console.time("push-join");
    arr = [];
    for (var i = 0; i< iterations; i++) {
        arr.push("a b c d e f g h i j k l m");
    }
    console.time("join-only");
    content = arr.join(",");
    console.timeEnd("join-only");
    console.timeEnd("push-join");

    content = "";

    console.time("concatenate");    
    for (var i = 0; i< iterations; i++) {
        content += "a b c d e f g h i j k l m";
    }
    console.timeEnd("concatenate");

}

这取决于:

铬 79.0.3945

Array Join 慢 30%

火狐 71.0.0

String Concat 慢 90%

https://jsperf.com/lin-array-join-vs-string-concat