JavaScriptコードのパフォーマンステストはどのように行いますか?


337

CPUサイクル、メモリ使用量、実行時間など?

追加:コードの実行速度の認識以外に、JavaScriptでパフォーマンスをテストする定量的な方法はありますか?


あなたは見たいかもしれませんYSlowのの Firefox用のプラグイン。
ロブ・ウェルズ

7
これは、ロードにかかる時間を示すだけです。問題は、実行中のパフォーマンスに関するものだったと思います。
サムハスラー

最も一般的な方法でパフォーマンスのためにコードをインストルメントしたい場合(そして特定の関数に焦点を合わせることができるので最も正確です)。この投稿は、タイマーを使用して(しかし、あなたはチャンスを持っている場合、あなたが本当にPerformance.nowをご覧ください)のまともな例があります:albertech.blogspot.com/2015/07/...

1
ブラウザですばやく簡単にテストするには、jsben.chを
EscapeNetscape

回答:


325

プロファイラーは間違いなく数値を取得する良い方法ですが、私の経験では、知覚されるパフォーマンスはユーザー/クライアントにとって重要なすべてです。たとえば、Extアコーディオンが拡張されていくつかのデータが表示され、次にネストされたExtグリッドがいくつかあるプロジェクトがありました。すべてが実際にかなり高速にレンダリングされていて、単一の操作に長い時間がかかったわけではありません。一度に大量の情報がレンダリングされていたため、ユーザーにとっては遅く感じられました。

これを「修正」するには、より高速なコンポーネントに切り替えるか、メソッドを最適化するのではなく、まずデータをレンダリングしてから、setTimeoutを使用してグリッドをレンダリングします。したがって、最初に情報が表示され、次にグリッドが2番目に表示されます。全体的に、この方法で処理するために少し多くの処理時間がかかりましたが、ユーザーにとって、認識されるパフォーマンスは向上しました。


これらの日、クロームプロファイラやその他のツールが普遍的に利用可能と使いやすい、などありconsole.time()console.profile()performance.now()。Chromeではタイムラインビューも表示されるため、フレームレートを低下させている原因や、ユーザーが待機している可能性がある場所などを確認できます。

これらすべてのツールのドキュメントを見つけるのはとても簡単です。そのためのSOの答えは必要ありません。7年後も、元の回答のアドバイスを繰り返します。ユーザーが気付かないところではコードが永久に実行され、ユーザーが実行するコードはかなり高速に実行される可能性があることを指摘します。かなり速いコードは十分に速くありません。または、サーバーAPIへのリクエストに220ミリ秒かかりました。またはそのような何か。重要な点は、プロファイラーを取り出して、やるべき作業を探しに行くと、それを見つけることができるということですが、ユーザーが必要とする作業ではない可能性があります。


3
これは、よく知られている優れたパフォーマンスのアルゴリズムが導入された後の微調整ステップです。
Rafael Xavier 14年

1
これは、質問が説明するほとんどの状況に実用的なアプローチを取るという点で、本当に良い答えです。ただし、これはユーザーの認識だけではなく、これを測定する別の方法があるかどうかを尋ねる質問には答えません。ボタンがフリーズしたときなどのダウンタイム全体は、pramodcの回答のメソッドとそれに添付されているコメントを使用して測定できます。
RoboticRenaissance

202

知覚されたパフォーマンスが本当に重要なすべてであることに私は同意します。しかし、時々私は何かをするためのより速い方法を見つけたいだけです。時々違いは巨大で、知る価値があります。

あなただけのJavaScriptタイマーを使用することができます。しかし、私は通常、ネイティブのChrome(現在はFirefoxとSafariでも)のdevToolメソッドconsole.time()console.timeEnd()

使い方の例:

var iterations = 1000000;
console.time('Function #1');
for(var i = 0; i < iterations; i++ ){
    functionOne();
};
console.timeEnd('Function #1')

console.time('Function #2');
for(var i = 0; i < iterations; i++ ){
    functionTwo();
};
console.timeEnd('Function #2')

結果はこのようになります

アップデート(2016年4月4日):

Chromeカナリアは最近、ラインレベルプロファイリングの[開発ツールソース]タブを追加しました。これにより、各ラインの実行にかかった正確な時間を確認できます。 ここに画像の説明を入力してください


はい、この1つの魅力の1つは、実装が高速かつ簡単であることです。ロギング自体は、JavaScriptの実行からパフォーマンスの一部を奪うのでしょうか。ゲームにループがあり、複数のログ行を出力するとします。たとえば、1秒間に5分間、つまり300行です。誰か知ってる?
K.キリアンリンドバーグ

これはまだ動作していますか?Chromeでは表示されません。
例による統計の学習2015


@ K.KilianLindberg Loggingは、コードと同様に、常にパフォーマンスから時間がかかりますが、a)テストでは一貫性があり、b)ライブコードでコンソールロギングを行うべきではありません。私のマシンでテストした後、時間ロギングはMSのほんの一部にすぎませんが、それを行うとさらに多くなります。
Polyducks 2018

92

単純な日付オブジェクトを使用して、任意の関数費やした時間を常に測定できます

var start = +new Date();  // log start timestamp
function1();
var end =  +new Date();  // log end timestamp
var diff = end - start;

10
このソリューションはミリ秒単位で差分を返すことに注意してください
Chris Bier

16
ミリ秒単位の時間はシステム要因によって異なる可能性があるため、Date()の使用はお勧めしません。代わりに、console.time()およびconsole.timeEnd()を使用してください。詳細については、JQuery Loverによる回答を参照してください。
mbokil 2013

44
さらに使いやすいperformance.now()
edan

1
performance.now()を使用する前に、ブラウザの互換性を確認してください。developer.mozilla.org/en-US/docs/Web/API/Performance/...
AR_HZ

日付は、経過した時間を実際に表すものではありません。それに関するこの記事をチェックしてください:sitepoint.com/measuring-javascript-functions-performance。Performance.now()はより正確なタイムスタンプです。
Millsionaire 2018年

61

jsPerfを試してください。これは、コードスニペットのベンチマークと比較を行うためのオンラインのJavaScriptパフォーマンスツールです。いつも使っています。



ops / secの測定値を提供するため、これもお勧めします(コードを複数回実行します)
Richard

jsPerfの場合は+9001(9,000以上です)。私は定期的に同様の方法でこれを使用%timeitしてipythonPythonコードのためのREPLシェル。
amcgregor

37

現在、ほとんどのブラウザが高解像度のタイミングを実装していperformance.now()ます。new Date()システムクロックとは独立して動作するため、パフォーマンステストよりも優れています。

使用法

var start = performance.now();

// code being timed...

var duration = performance.now() - start;

参考文献


2
さらに優れているのは、上に構築されたUser Timing APIを使用することperformance.now()です。
クリス

30

JSLitmusは、アドホックJavaScriptベンチマークテストを作成するための軽量ツールです。

function expressionとの間のパフォーマンスを調べてみましょうfunction constructor

<script src="JSLitmus.js"></script>
<script>

JSLitmus.test("new Function ... ", function() { 
    return new Function("for(var i=0; i<100; i++) {}"); 
});

JSLitmus.test("function() ...", function() { 
       return (function() { for(var i=0; i<100; i++) {}  });
});

</script>

上記で行ったことはfunction expressionfunction constructor同じ操作を作成して実行することです。結果は次のとおりです。

FireFoxパフォーマンス結果

FireFoxパフォーマンス結果

IEのパフォーマンス結果

IEのパフォーマンス結果


リンクされたJSLitmusページには、壊れたダウンロードリンクが含まれています。JSLitmus(ブラウザ用)とjslitmus(NodeJS用、小文字!)を見つけました。
Rob W

16

一部の人々は特定のプラグインやブラウザを提案しています。それらがその1つのプラットフォームでのみ実際に役立つからではありませ。Firefoxでテストを実行すると、IE7に正確に変換されません。99.999999%のサイトで複数のブラウザーがアクセスしていることを考えると、人気のあるすべてのプラットフォームでパフォーマンスを確認する必要があります。

私の提案は、これをJSに保持することです。すべてのJSテストをオンにし、実行時間を測定するベンチマークページを作成します。AJAXで結果をポストして、完全に自動化することもできます。

次に、すすぎ、異なるプラットフォームで繰り返します。


5
これは本当ですが、ブラウザー固有の問題とは何の関係もないコーディングの問題がある場合は、プロファイラーが適しています。
ジョンボーカー、2009

1
承知しました!ええ、彼らは一般的な「悪いコーディング」の問題をキャッチし、特定の問題は実際のデバッグを行うのに最適ですが、一般的なユースケースのテストでは、すべてのプラットフォームで実行できるものからメリットを得られます。
Oli

2
これは本当ですが、Firebugのようなプロファイラーを使用することは、ボトルネックを見つけるために不可欠ではないにしても、素晴らしいことです。
ペッカ

1
" 99.999999%のサイトを検討しています… "作成したと思います…:-/
RobG

@RobG私は小数点第2位を過大評価しているかもしれませんが、開発プラットフォームはおそらく展開プラットフォームが保持するものと同じになることはないだろうという考えです。
Oli

11

小さなツールを使用して、ブラウザーで小さなテストケースをすばやく実行し、すぐに結果を取得できます。

JavaScript速度テスト

コードをいじって、テスト済みのブラウザーでどちらの手法が優れているかを確認できます。


ありがとう、これは私が探していたものです。
ジョセフシーディ


9

次に、渡された関数の実行時間を表示する単純な関数を示します。

var perf = function(testName, fn) {
    var startTime = new Date().getTime();
    fn();
    var endTime = new Date().getTime();
    console.log(testName + ": " + (endTime - startTime) + "ms");
}


4

素早い回答

jQuery(より具体的にはSizzle)では、これを使用(チェックアウトマスターとブラウザーでspeed / index.htmlを開きます)、これはbenchmark.jsを使用します。これは、ライブラリのパフォーマンステストに使用されます。

長い答え

読者がベンチマーク、ワークロード、プロファイラーの違いを知らない場合は、まずspec.orgの「readme 1st」セクションでいくつかのパフォーマンステストの基礎を読んでください。これはシステムテスト用ですが、この基礎を理解することは、JSパフォーマンステストにも役立ちます。いくつかのハイライト:

ベンチマークとは何ですか?

ベンチマークは「測定または評価の標準」(ウェブスターのII辞書)です。コンピュータベンチマークは通常、厳密に定義された一連の操作(ワークロード)を実行し、テストされたコンピュータのパフォーマンスを説明する何らかの形の結果(メトリック)を返すコンピュータプログラムです。コンピュータのベンチマーク指標は通常、速度を測定します。ワークロードの完了速度。またはスループット:単位時間あたりに完了したワークロードユニットの数。複数のコンピューターで同じコンピューターベンチマークを実行すると、比較を行うことができます。

自分のアプリケーションをベンチマークする必要がありますか?

理想的には、システムの最良の比較テストは、独自のワークロードを備えた独自のアプリケーションになるでしょう。残念ながら、独自のワークロードで独自のアプリケーションを使用して、さまざまなシステムの信頼性が高く、再現性があり、比較可能な幅広い測定値を取得することは、多くの場合非現実的です。問題には、適切なテストケースの生成、機密性の懸念、同等の条件の確保の困難さ、時間、お金、またはその他の制約が含まれる場合があります。

私自身のアプリケーションではない場合、何ですか?

標準化されたベンチマークを参照ポイントとして使用することを検討してください。理想的には、標準化されたベンチマークは移植可能で、興味のあるプラットフォームですでに実行されている可能性があります。ただし、結果を検討する前に、アプリケーション/コンピューティングのニーズとベンチマークは測定中です。ベンチマークは、実行するアプリケーションの種類と似ていますか?ワークロードには同様の特性がありますか?これらの質問に対するあなたの回答に基づいて、ベンチマークがあなたの現実にどのように近似するかを見ることができます。

注:標準化されたベンチマークは、参照ポイントとして役立ちます。それにもかかわらず、ベンダーまたは製品の選択を行っている場合、SPECは、標準化されたベンチマークが実際のアプリケーションのベンチマークに取って代わることができるとは主張していません。

JSのパフォーマンステスト

理想的には、最良のパフォーマンステストは、独自のアプリケーションと独自のワークロードを使用して、テストする必要があるもの(異なるライブラリ、マシンなど)を切り替えることです。

これが実現可能でない場合(そして通常は不可能です)。最初の重要なステップ:ワークロードを定義します。アプリケーションのワークロードを反映する必要があります。で、この話、ヴャチェスラフEgorovはあなたが避けなければならないくだらないワークロードについて語っています。

次に、benchmark.jsなどのツールを使用して、通常は速度やスループットなどの指標の収集を支援します。Sizzleでは、修正または変更がライブラリのシステムパフォーマンスにどのように影響するかを比較することに関心があります。

パフォーマンスが本当に悪い場合、次のステップはボトルネックを探すことです。

ボトルネックを見つけるにはどうすればよいですか?プロファイラー

JavaScriptの実行をプロファイルする最良の方法は何ですか?


3

実行時間は最善の方法だと思います。


何とは対照的に?私は上手く理解できていない気がします。
Pekka、

元のポスターの質問とは対照的に:「CPUサイクル、メモリ使用量、実行時間など?」
スニッカー2009


2

私は通常、JavaScriptのパフォーマンス、スクリプトの実行時間をテストします。jQuery Loverは、JavaScriptコードのパフォーマンスをテストするための優れた記事リンクを提供しましたが、この記事は、JavaScriptコードの実行時間をテストする方法のみを示しています。また、「巨大なデータセットを操作しながらjQueryコード改善するための 5つのヒント」という記事を読むことをお勧めします


2

これは、時間パフォーマンスのための再利用可能なクラスです。例はコードに含まれています:

/*
     Help track time lapse - tells you the time difference between each "check()" and since the "start()"

 */
var TimeCapture = function () {
    var start = new Date().getTime();
    var last = start;
    var now = start;
    this.start = function () {
        start = new Date().getTime();
    };
    this.check = function (message) {
        now = (new Date().getTime());
        console.log(message, 'START:', now - start, 'LAST:', now - last);
        last = now;
    };
};

//Example:
var time = new TimeCapture();
//begin tracking time
time.start();
//...do stuff
time.check('say something here')//look at your console for output
//..do more stuff
time.check('say something else')//look at your console for output
//..do more stuff
time.check('say something else one more time')//look at your console for output

1

UXプロファイラーは、ユーザーの観点からこの問題に取り組みます。一部のユーザーアクション(クリック)によって発生したすべてのブラウザーイベント、ネットワークアクティビティなどをグループ化し、レイテンシ、タイムアウトなどのすべての側面を考慮に入れます。


1

私は似たようなものを探していましたが、これを見つけました。

https://jsbench.me/

これにより、左右の比較が可能になり、結果を共有することもできます。


0

重要なルールは、いかなる状況でもユーザーのブラウザをロックしないことです。その後、私は通常、実行時間を見て、続いてメモリ使用量を調べます(クレイジーなことをしている場合を除いて、その場合は優先度が高くなる可能性があります)。


0

パフォーマンステストは最近流行語のようになりましたが、パフォーマンステストがQAや製品の出荷後においても重要なプロセスではないということではありません。そして、私は多くの異なるツールを使用してアプリを開発していますが、Chromeプロファイラーのような上記のツールの一部は、SaaSまたは何かオープンソースを見ていて、何かがおかしくなったという警告が表示されるまで忘れてしまいます。 。

基本的なアラートを設定するためだけにフープを飛び越えなくても、パフォーマンスを監視できる素晴らしいツールがたくさんあります。自分でチェックする価値があると思うものをいくつか紹介します。

  1. Sematext.com
  2. Datadog.com
  3. Uptime.com
  4. Smartbear.com
  5. Solarwinds.com

試してみて、鮮明な画像をペイントするには、ここでは監視アプリケーションを反応させるための設定方法にはほとんどのチュートリアルです。


-1

これは、特定の操作のパフォーマンス情報を収集するのに適した方法です。

start = new Date().getTime(); 
for (var n = 0; n < maxCount; n++) {
/* perform the operation to be measured *//
}
elapsed = new Date().getTime() - start;
assert(true,"Measured time: " + elapsed);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.