JavaScriptコードのベンチマークに役立つパッケージはありますか?Firebugやそのようなツールについては言及していません。
実装した2つの異なるJavaScript関数を比較する必要があります。私はPerlのベンチマーク(Benchmark.pm)モジュールに非常に精通しており、JavaScriptで類似したものを探しています。
JavaScriptコードのベンチマークに重点が置かれていますか?関数を1回実行するだけでタイミングを回避できますか?
JavaScriptコードのベンチマークに役立つパッケージはありますか?Firebugやそのようなツールについては言及していません。
実装した2つの異なるJavaScript関数を比較する必要があります。私はPerlのベンチマーク(Benchmark.pm)モジュールに非常に精通しており、JavaScriptで類似したものを探しています。
JavaScriptコードのベンチマークに重点が置かれていますか?関数を1回実行するだけでタイミングを回避できますか?
回答:
各関数の反復回数を数えるだけです。おそらく1回の反復では十分ではありませんが、(関数の複雑さに応じて)100回または1,000回の反復に近いところでうまくいくはずです。
Firebugには、関数のどの部分が速度を低下させているのかを確認したい場合に、プロファイラーもあります。
編集:将来の読者にとって、JSperfを推奨する以下の答えが正しい答えであるべきです。私は削除しますが、OPによって選択されたため、削除できません。ベンチマークには、多くの反復を実行するだけでなく、JSPerfが代わりに処理します。
jsperf.comは、JSのパフォーマンスをテストするための頼りになるサイトです。そこから始めましょう。コマンドラインまたはスクリプトから独自のテストを実行するためのフレームワークが必要な場合は、jsperf.comが構築されているライブラリであるBenchmark.jsを使用します。
注: Javascriptコードをテストする人は、「マイクロベンチマーク」(実際のコードパターンに基づくより複雑なテストではなく、特定の機能または操作を対象とする小さなテスト)の落とし穴について学ぶ必要があります。このようなテストは便利ですが、最新のJSランタイムがどのように動作するかにより、不正確になる傾向があります。 パフォーマンスとベンチマークに関するVyacheslav Egorovのプレゼンテーションは、問題の性質を理解するために一見の価値があります。
編集:私のJSLitmusへの参照を削除しました。これはもはや関連性がないか、役に立たなくなったためです。
ミックスにクイックタイマーを追加するだけです。
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
単純な方法です。
console.time('test');
console.timeEnd('test');
私はこの@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;
};
まともなクロスブラウザのベンチマークを書くことは本当に難しいです。事前に定義されたコードの反復回数を単に測定するだけでは、完全に防護されません。
@broofaがすでに示唆したように、jsPerfをチェックしてください。舞台裏でBenchmark.jsを使用します。
カスタムベンチマークスクリプトを作成する場合、一部のブラウザは、DOM操作が定義されている関数が終了した後にのみDOM操作を適用することに注意してください。詳細はこちら http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html
シンプルなものが必要な場合は、次のようにすることができます。
'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)