2

私は現在、JavaScript 関数の速度をテストするための小さなフレームワークを作成しています。同じパラメーターで同じメソッドを繰り返し呼び出すと、奇妙な結果が得られます。

Function           Execution Time

isEvenBitwise      38.00000000046566
isEvenModulo       38.00000000046566
isEvenPointless    38.00000000046566

ここに私の機能があります:

var myFunctions = 
{
    isEvenBitwise: function(number) 
    {
        return !(number & 1);  
    },
    isEvenModulo: function(number)
    {
        return (number % 2 == 0);
    },
    isEvenPointless: function(number)
    {
        return 1;
    }
}

関数を実行するコード:

PerformanceTest.prototype.measureTime = function()
{
    for (var indexTests = 0; indexTests < this.testCount; indexTests++)
    {
        var results = [];

        for (var currentFunction in this.functions) {
            var contextFunction = this.functions[currentFunction];

            var startTime = performance.now();
            for (var i = 0; i < this.iterationsPerTest; i++)
            {
                var heh = contextFunction.apply(this, arguments)
            }
            var executionTime = performance.now() - startTime;

            var result = {};
            result.testName = currentFunction;
            result.executionTime = executionTime;
            results.push(result);
        }

        this.testResults.push(results);
    }
}

JavaScript インタープリターはコードをキャッシュ/最適化しますか? もしそうなら、それはどのように機能しますか?それとも、私が気付いていない他の何かが起こっていますか?

編集:これはクロムでのみ発生するようです.Firefoxはこれらの結果で問題なく動作します:

Function           Execution Time

isEvenBitwise      9.652258097220447
isEvenModulo       37.546061799704376
isEvenPointless    8.512472488871936
4

1 に答える 1

0

あなたのコードを見た後、Chrome はあなたがしていることについて賢いと推測します。これを見ています:

 var startTime = performance.now();
 for (var i = 0; i < this.iterationsPerTest; i++)
 {
      var heh = contextFunction.apply(this, arguments)
 }
var executionTime = performance.now() - startTime;

contextFunction に副作用がないことを正しく評価し、heh変数がループ スコープ内にのみ存在し、使用されないことを認識し、何もしないためループ全体を最適化します。

于 2013-04-18T10:20:10.740 に答える