7

コードを最適化する方法を探していたところ、この jsPerf testにたどり着きました。関数呼び出しが遅いという私の考えが再確認されること以外に何も期待していなかったので、IE 9 での私の結果は本当にループに陥りました。関数呼び出しを利用したコードの方が高速でしたが、この 1 つのブラウザーでのみでした。同じ結果で複数回実行しました。テストが正しく設定されていないことがわかりません。この奇妙な結果の原因は何ですか?

ユーザー エージェントはMozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0Windows Server 2008 で実行されています。

4

1 に答える 1

4

免責事項:私はjsPerf.comの作成者です。


最初のテストは次のとおりです。

var i = 0;
for (i = 0; i < 1000; i++) {
  test()
}

forそこにループを含めるのはなぜですか?結果を歪めるだけです。jsPerf は、統計的に有意な結果を得るのに十分なテストを実行するまで、テスト コードを自動的に繰り返します。理想的には、jsPerf テストはできるだけコンパクトで、本当にテストしたいものだけをテストします。この場合、forループのパフォーマンスにはまったく関心がありません。関数を呼び出すよりもコードをインライン化する方が速いかどうかを知りたいだけです。

堅牢な jsPerf テスト ケースの作成に関するその他のヒントに興味がある場合は、私の #jsconfeu2011 プレゼンテーション をご覧ください

for注:この結果が表示される理由が冗長ループにあると言っているわけではありません。それは要因かもしれませんが、結果をさらにゆがめる何か他のものがあるかもしれません. これは、IE9 の「デッド コードの削除」機能が開始された可能性があります。

とにかく、私はあなたの jsPerf テストをフォークし、ループを削除し、変数をグローバルにして、デッド コードの除去の最適化を回避しようとしました。http://jsperf.com/function-calls-vs-inline/3 IE9 でこれをテストできますか? 現在、手元にある IE9 VM はありません。

于 2013-07-13T19:33:46.037 に答える