2

以下の2つの機能の違いは何ですか?

ここで、JavaScript エンジンが何らかのナノ最適化を行っているかどうか疑問に思っています。

function withoutVar() {                                                                                                                   
  return 'stackoverflow';                                                                                                                    
}
function withVar() {
  var result = 'stackoverflow';
  return result;
}
var a = withoutVar();
var b = withVar();  
4

2 に答える 2

7

一部のエンジンは、このような最適化を実行する場合があります。Google Closure コンパイラは確かにそうします:

function withVar(){return"stackoverflow"}var a=withVar();

速度に実質的な違いはありませんが、「最適化された」バージョンの方が短くなります (そのため、クライアントのダウンロードが速くなります)。ベンチマークの結果は次のとおりです。

ここに画像の説明を入力

「フラット」バージョン (変数宣言なし) がわずかに高速であることがわかります (ただし、1 秒あたりの操作を見てください。これは、速度に関して考える価値のない最適化です)。

于 2012-11-06T13:22:22.637 に答える
4

違いは、関数によって、実装が下にあるActivation ObjectそれぞれのLexical Environment RecordwithVarにアクセスすることです。技術的には、この関数の実行は遅くなりますが、マイクロ最適化については話していませんが、ナノ最適化のようなものです。

一部のブラウザは、実際にそのコードを直接returnステートメント forに最適化する場合がありwithVarます。V8エンジンを搭載したWebkitまたは少なくともChromeは、そのための良い候補です. いずれにせよ、これはまったく些細なことであり、ここで実行時のパフォーマンスを気にする必要はありません。

JSPerf ベンチマーク

私のマシン(Chrome)での違いは、約0.32%7.000.000回の呼び出しです。


このようなものを購入することを検討する唯一の議論は、前者の関数がより少ない文字で機能するということです。そのようにして、ファイルサイズを最適化し、ネットワーク経由のトラフィックを減らすことができます (ただし、その場合でも、実際に機能する前に、多くのインスタンスでそのようなステートメントを最適化する必要があります)。

于 2012-11-06T13:22:07.673 に答える