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));   
}

src他の変数 (と以外dst) は、この関数への既存の呼び出しがある場合に備えて、元のコード構造を維持するためだけにあることに注意してください。それらは使用されず、削除できます。

于 2013-03-19T14:07:09.630 に答える
0

驚くべきことに、Slow Copy が勝者です。僅差で:

 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 に答える