web-dev-qa-db-ja.com

JavaScriptコードをベンチマークするにはどうすればよいですか?

JavaScriptコードのベンチマークに役立つパッケージはありますか? Firebugやそのようなツールについて言及しているわけではありません。

実装した2つの異なるJavaScript関数を比較する必要があります。私はPerlのベンチマーク( Benchmark.pm )モジュールに精通しており、JavaScriptで似たようなものを探しています。

JavaScriptコードのベンチマークに重きを置いていますか?関数を1回実行するだけでタイミングを調整できますか?

94
Ionic Walrus

各関数の反復を数回計ってください。おそらく、1回の反復では十分ではありませんが、(関数の複雑さに応じて)100回近く、または1,000回の反復で作業を行う必要があります。

Firebugには profiler もあります。関数のどの部分が遅くなっているのかを確認したい場合です。

Edit:将来の読者には、JSPerfを推奨する以下の回答が正しい答えになるはずです。私は私のものを削除しますが、OPによって選択されているため、できません。ベンチマークには、多くの反復を実行するだけでなく、JSPerfが面倒を見てくれます。

33
Sasha Chedygov

jsperf.com は、JSパフォーマンスをテストするためのサイトです。そこから始めましょう。コマンドラインまたはスクリプトから独自のテストを実行するためのフレームワークが必要な場合は、 Benchmark.js (jsperf.comが構築されるライブラリ)を使用します。

注:Javascriptコードをテストする人は、「マイクロベンチマーク」(より複雑なテストではなく、特定の機能または操作をターゲットとする小さなテスト)の落とし穴について自ら学習する必要があります。実際のコードパターンに基づいています)。このようなテストは有用ですが、最新のJSランタイムがどのように動作するかによって不正確になる傾向があります。 パフォーマンスとベンチマークに関するVyacheslav Egorovのプレゼンテーション は、問題の性質を理解するために見る価値があります。

編集:JSLitmusの機能への参照を削除しました。

113
broofa

簡単なタイマーをミックスに追加するだけで、誰かが役に立つかもしれません:

var timer = function(name) {
    var start = new Date();
    return {
        stop: function() {
            var end  = new Date();
            var time = end.getTime() - start.getTime();
            console.log('Timer:', name, 'finished in', time, 'ms');
        }
    }
};

理想的にはクラスに配置され、上記の例の目的で行ったようにグローバルとして使用されません。それを使用することは非常に簡単です:

var t = timer('Some label');
// code to benchmark
t.stop(); // prints the time elapsed to the js console
64
Kenny

簡単な方法です。

console.time('test');
console.timeEnd('test');
32
stadnik0ff

@musicfreaks answerのこの単純な実装を使用しています。機能はありませんが、本当に使いやすいです。このbench(function(){return 1/2;}, 10000, [], this)は1/2 10,000回計算します。

/**
 * Figure out how long it takes for a method to execute.
 * 
 * @param {Function} method to test 
 * @param {number} iterations number of executions.
 * @param {Array} args to pass in. 
 * @param {T} context the context to call the method in.
 * @return {number} the time it took, in milliseconds to execute.
 */
var bench = function (method, iterations, args, context) {

    var time = 0;
    var timer = function (action) {
        var d = Date.now();
        if (time < 1 || action === 'start') {
            time = d;
            return 0;
        } else if (action === 'stop') {
            var t = d - time;
            time = 0;    
            return t;
        } else {
            return d - time;    
        }
    };

    var result = [];
    var i = 0;
    timer('start');
    while (i < iterations) {
        result.Push(method.apply(context, args));
        i++;
    }

    var execTime = timer('stop');

    if ( typeof console === "object") {
        console.log("Mean execution time was: ", execTime / iterations);
        console.log("Sum execution time was: ", execTime);
        console.log("Result of the method call was:", result[0]);
    }

    return execTime;  
};
19
fncomp

適切なクロスブラウザベンチマークを作成するのは非常に困難です。コードの繰り返しの事前定義された回数を計るだけで 防弾ではありません です。

@broofaが既に提案したように、 jsPerf をチェックしてください。 Benchmark.js を舞台裏で使用します。

8
Mathias Bynens

カスタムベンチマークスクリプトを記述する場合、一部のブラウザは、定義されている機能が終了した後にのみdom操作を適用することに注意してください。詳細はこちら http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html

2
lukins

簡単なものが必要な場合は、次のようにします。

'use strict'
console.clear()

const powerOf = x => y => Math.pow(x, y)
const powerOfThree = powerOf(3)

function performanceCalc(fn, ...params) {
    const start = +new Date()
    const result = fn(...params)
    const end = +new Date()

    console.log(`Result: ${result}. Execution Time: ${end - start} ms`)
}

performanceCalc(powerOfThree, 2)

コードの例はこちら

1
Vlad Bezden