这是JS数组复制在没有循环展开的情况下最快的速度吗?

Is this as fast as JS array copy can get without loop unrolling?

本文关键字:情况下 速度 循环展开 数组 JS 复制 这是      更新时间:2023-09-26

这与这个问题有关。

我听说带有减量和大于test的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

arrayCopy -

2,899
±5.27%
fastest

slowCopy - WINNER

2,977
±4.86%
fastest

aCopy——

2,810
±4.61%
fastest

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

谁说你需要一个循环?

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

该方法对数组进行深度克隆。下面是一个函数:

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

请记住其他变量(除了srcdst)只是为了维护您的原始代码结构,以防您已经对该函数进行了预先存在的调用。

慢速复制出人意料地成为赢家。

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

我认为这是最快的方法:

var original = [1, 2, 3];
var copy = original.slice(0);