2016-03-22 5 views
2

私はjsperf test caseを持っており、結果はかなり混乱しています。それらはすべて同じ速度について出てくる、どうすれば私のjavascriptテストケースを「最適化する」ことを避けることができますか?

  • 乗算
  • 制御は(どちらも操作が行われている)
  • 部門

と、ほとんどの時間..:私は3、「スニペット」を持っていますコントロールさえ!私はJS JITコンパイラがremoving my "unnecessary" instructionsだったと思っていましたが、何の効果もなかったようです。テストループが完了したとき、私はaccumulating the results, and logging them to the consoleを始めました。

for (var i = 0; i < nNumbers; i++) { 
    result += a[i]/b[i]; 
} 
console.log(result); 

しかし、そうでないときからコンソールを開いたときに私は大きく違った結果を得ました。コンソールロギングからの減速は、他のパフォーマンス上の問題を圧倒していました。

私はテストしようとしている操作に比べてロギングの量を最小限に抑えるために、各「スニペット」内で反復回数を調整してみました。しかし、私はまだ3つのスニペットの間に大きな速度差はありません。実際には、除算と乗算の両方が、定数を評価するのとほぼ同じ速度ですか?私は間違ったことをする必要があります。またはjsperfが壊れています。

既に回答済みの質問はありますが、Javascriptベンチマークに特有のものはありません。

+0

コンピュータでは分裂が遅いので、予想通り、ops a:mult:126k、div:33k、control:282kを得ました。 http://jsperf.com/multiplication-vs-division-lars/2 – dandavis

+0

@dandavis私は同様の結果を得る – BeyelerStudios

+1

と言っていたが、チャートは正常に機能していないようだが、数値自体は問題ありませんでした。 – dandavis

答えて

1

あなたのタイミングのセクションでconsole.log Sを入れないでください。実際に測定したい操作との比較がひどく遅いので、結果が歪んでしまいます。また、あなたが気づいたように、それはコンソールが開いているかどうかに応じて変化します。

結果をグローバル配列に入れることで、最適化を防止できます。オプティマイザは、結果に影響を与えないremove codeのみであり、グローバル状態を操作する場合は不可能です。

もちろん、これは必ずしもloop-invariant code motionを防ぐわけではありませんので、タイムコードが常に異なるデータで動作するようにする必要があります。

+0

結果をグローバル配列にする例がありますか? 'setup'コードで' var results; 'を宣言すると、それはグローバル変数か、それとも準備コードに入れなければなりませんか?単一の(スカラー)変数ではなく、配列でなければならないのでしょうか? (ループ不変のコードに関しては、ループを通る各反復が 'a [i]'と 'b [i]'で動作するので、私のテストスニペットは既にこれに耐性があると信じています。ループ変数) – LarsH

+0

宣言をセットアップコードに置くだけで十分ですが、実際にはグローバルではありません - オプティマイザの高度性によって異なります。あなたが追加するスカラーも同様に動作するはずですが、あなたが上書きするスカラーはおそらくそうではありません。 – Bergi

+0

結果をグローバル変数に入れる方法はありません。私は 'result'の宣言(実際には単数形)を準備コードに移動しようとしました(http:// jsperfを参照してください)。com/multiplication-vs-division-global-results)、それぞれのスニペットで 'ReferenceError:result is not defined'を取得しました。 – LarsH

関連する問題