3

シンプルな軽量every機能を実装しました。arguments変数が関数内で何らかの形で使用されている場合、実行時間が800ミリ秒から1300ミリ秒に増加することに気付きました(私の場合)。これは何が原因ですか?

Chrome 29.0.1547.66 mを使用しています。

http://jsfiddle.net/4znzy/

function myEvery(list, fun, withArgument) {
    var i;

    fun = fun || function(val) { return val };

    arguments; // with this statement the time is 1300 ms
               // if you comment it out -- 800 ms

    for (i = 0; i < list.length; i++) {
      if (!fun.call(list, list[i], i)) {
        return false;
      }
    }

    return true;
};

// Create a huge array
var list = [];
for (i = 1; i < 20000000; i++) {
    list.push(i);
}

// Measure the time
t1 = (new Date).getTime();
myEvery(list);
t2 = (new Date).getTime();

alert(t2 - t1);

arguments(ステートメント自体を実行する時間を測定する場合は、0 ミリ秒です。)

4

1 に答える 1

1

の外観はarguments、関数のパラメーターの動的なゲッターのようなもので、スタックから読み取る必要があり、コピーされます。パラメータのような大きなオブジェクト (大きいだけでなく多数)もコピーlistする必要があります。

argumentsこれは、行を次のように置き換えることで確認できます

var args = [list.slice(0)]; // copy parameter

その結果、同様の時間が発生します。私のマシンでは、追加で 150argumentsと 200です。slice()

JS エンジンの実装に応じて、これは遅くなったり速くなったりしますが、確実に実行時間が長くなります。おそらく(まだテストしていませんが) ブラウザや代替 JS エンジンによってかなり大きな違いがあります。

于 2013-09-06T06:27:18.890 に答える