質問

Dateオブジェクトを作成し、それを使用して関数の実際の作業の前後の時間をミリ秒単位で取得することにより、一部のJavaScriptプログラムを高速テストしています。本体を単純なforループの追加にし、最後に新しいmsから古いmsを減算し、それを出力します。ただし、すべてが0ミリ秒で終了します。書き込みで確認する時間は作業の前後で同じであるため、これは理にかなっています。私はそれを正しくやっていますか?JavaScript(Chromeで)は非常に高速ですか、または変数を台無しにしている舞台裏のものがいくつかあります。

役に立ちましたか?

解決

Dateオブジェクトはミリ秒単位で時間を返しますが、実際にはその背後のタイマーの解像度ではありません。例として、タイマーは10ミリ秒ごとに1回作動します。プロセスに3ミリ秒しかかからない場合、ほとんどの場合、ゼロ以外の測定値は表示されません(10ミリ秒表示されることもあります)。

解決策は、関数を何度も実行し、すべての時間を計ることです。たとえば、100万回実行し、合計時間を1000000で割って、1回の実行の平均時間を取得します。

他のヒント

私のこの質問への回答では、簡単なベンチマーク比較を実装する方法について説明しています。 @Greg Hewgillが指摘したように、テストを複数回実行して、特定のテストが実際にテストする期間の正確な表現を取得することが重要です。

通常、次のような単純なものに要約されます。

var MAX = 100000, i =  0, 
    s   = null,   e = null;

console.info("`someMethodToTest()` over %d iterations", MAX);
s = new Date();
do {
    someMethodToTest();
} while ( ++i < MAX );
e = new Date();

console.log("Total: %dms; average: %dms", +e - +s, (+e - +s) / MAX);

本当にコードを見る必要があります。いずれにせよ、ゼロの理由として考えられるのは、ループが非同期で実行されていることです。インタープリターはループの終わりまで待機せずに次の命令にジャンプします。または、もちろん、ループは非常に高速です。

ところで、JavaScriptプロファイラの使用に興味があるかもしれません。 Firefoxの Firebug には便利なものがあります。コンソールを開いて、プロフィールをクリックするだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top