JavaScriptコードをベンチマークするにはどうすればよいですか?[閉まっている]


104

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

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

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


dupのようです:stackoverflow.com/search
q


私はそれが完全なものではなく、すべてではないことを知っていますが、とにかく関連しています:場合によっては、関数の実行にかかる時間を測定する方法を知りたいだけです。
Skippy le Grand

1
私はJavaScriptベンチマークツールとして、jsben.ch
EscapeNetscapeを

回答:


36

各関数の反復回数を数えるだけです。おそらく1回の反復では十分ではありませんが、(関数の複雑さに応じて)100回または1,000回の反復に近いところでうまくいくはずです。

Firebugには、関数のどの部分が速度を低下させているのかを確認したい場合に、プロファイラーもあります。

編集:将来の読者にとって、JSperfを推奨する以下の答えが正しい答えであるべきです。私は削除しますが、OPによって選択されたため、削除できません。ベンチマークには、多くの反復を実行するだけでなく、JSPerfが代わりに処理します。


12
事前に定義されたコードの反復回数を単に測定するだけでは、完全に防護されません。また、Firebugを開くと、FirefoxのJust-In-Time(JIT)コンパイラーが無効になります。つまり、テストはインタープリターで実行されます。つまり、テストが他の場合よりもはるかに遅くなります。Firebugのプロファイラーを使用しても、期待した結果が得られません。
Mathias Bynens、2011

1
@マティアス:まあ、公平に言うと、この答えは本当に古いです。
Sasha Chedygov、2011

2
確かに、犯罪者はいない。この件に関してより多くの研究が行われた今、私は将来の参考のためにコメントすると思いました。
Mathias Bynens、2011

4
または使用jsben.ch jsperfがダウンしているので、
EscapeNetscape

118

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

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

編集:私のJSLitmusへの参照を削除しました。これはもはや関連性がないか、役に立たなくなったためです。


3
更新:jsperf.comを使用するだけです-ずっと良くなり、この種のことで本当にうまくいきます。jslitmusはまだ機能しますが、かなり長い間積極的に開発されていません。
ブロファ2011

これは優れた答えです。+1
ジャスティンフォース

1
jsperfを使用したかったのですが、Nループの実際の呼び出しのタイミングを計るのではなく、一定期間コードを実行できる回数を数えているようです。私は彼らが選択するオプションがあったらいいのにと思います。
Jeach 2013

1
@Jeach-jsperfは「操作/秒」を提供します。その値に、コードを実行する時間(秒単位)を乗算するだけです。
broofa 2013

4
更新:jsperfはオンラインではなくなりました。オンラインに戻る時期はわかりません。詳細については、このgithubスレッドを参照してください。
James Gould

73

ミックスにクイックタイマーを追加するだけです。

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

6
ここでクロージャを上手に使用します。
Dandy

12
より正確な結果を得るperformance.now()には、Date() developer.mozilla.org
en

私は必要なものだけ-はtimeit()
Gishu

1
TypeScriptバージョン:pastebin.com/gCs9CB5F
Alexander Taylor

1
node.jsの場合、process.hrtime()を使用しナノ秒の解像度を取得できます。
Xeoncross

56

単純な方法です。

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

3
これは受け入れられる答えになるはずです。サードパーティのサービスを使用するのは不便な場合があり、単純な組み込み機能を使用するだけでも優れています。
ブレインバッグ

1
@brainbag-問題はベンチマークについてでした。これには、コードの実行時間を測定するだけではありません。また、コンソールタイマーは、問題のコードが1ミリ秒(解像度の制限)を超える場合にのみ役立ちます。
ブローファ

タイマー値にアクセスする必要があるテストスイートでベンチマークを実行することもできます。
JamesDev

20

私はこの@musicfreaks回答の単純な実装を使用しています。機能はありませんが、とても使いやすいです。これ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;  
};



1

シンプルなものが必要な場合は、次のようにすることができます。

'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)

これがコードの例です


私の場合、シンプルが間違いなく最良の選択肢でした... APIの応答時間をベンチマークするためにいくつかのテストを作成します(非常に正確な時間の必要はありません)。
kashiraja 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.