0

这与这个问题有关

我听说带有递减和大于测试的 while 模式比任何其他循环模式都快。鉴于此,这是 js 中最快的数组复制吗?

    function arrayCopy(src,sstart,dst,dstart,length) {
            length += sstart;
            dstart += length;
            while(--length >= sstart) {
                    dst[--dstart] = src[length];    
            }       
    }

其他测试功能

       function slowCopy(src,sstart,dst,dstart,length) {
               for(var i = sstart; i < sstart+length;i+=1 ) {
                      dst[dstart++] = src[i];
               }
       }

       function aCopy(src,sstart,dst,dstart,length) {
              Array.prototype.splice.apply(dst,[dstart, length].concat(src.slice(sstart,sstart+length)));
       }

测试结果 http://jsperf.com/fastest-js-arraycopy

数组复制 -

2,899
±5.27%
fastest

慢复制 - 获胜

2,977
±4.86%
fastest

复印件 -

2,810
±4.61%
fastest

我想在 jsPerf 测试中添加更多以下建议的函数,但它们都没有包含源起始偏移量、目标起始偏移量或复制长度。无论如何,我对这些似乎与我预期相反的结果感到有些惊讶

4

3 回答 3

0

谁说你需要一个循环?

var myArrayCopy = JSON.parse(JSON.stringify(myArray));

此方法对数组进行深度克隆。这是一个函数:

function arrayCopy(src,sstart,dst,dstart,length) {
        dst = JSON.parse(JSON.stringify(src));   
}

请记住,其他变量(除了srcdst)只是为了维护您的原始代码结构,以防您对该函数进行预先存在的调用。它们不会被使用并且可以被移除。

于 2013-03-19T14:07:09.630 回答
0

令人惊讶的是,慢速复制是赢家。以微弱优势:

 function slowCopy(src,sstart,dst,dstart,length) {
           for(var i = sstart; i < sstart+length;i+=1 ) {
                  dst[dstart++] = src[i];
           }
   }
于 2013-03-26T10:17:55.010 回答
-1

我认为这是最快的方法:

var original = [1, 2, 3];
var copy = original.slice(0);
于 2013-03-19T14:24:00.603 回答