引数を最初に変数にするのではなく、式として渡すことにパフォーマンスの問題はありますか?
someFunction( x+2 );
対。
var total = x+2;
someFunction( total );
そして、関数はどうですか?
someFunction( someOtherFunction() );
引数を最初に変数にするのではなく、式として渡すことにパフォーマンスの問題はありますか?
someFunction( x+2 );
対。
var total = x+2;
someFunction( total );
そして、関数はどうですか?
someFunction( someOtherFunction() );
いいえ。さらに重要なのは、この種のマイクロ最適化は(ほぼ確実に)無意味です。
そうは言っても、式の結果を複数回使用する場合は、計算結果を保存することで、まったく気付かず、まったく心配する価値のない利点が得られる可能性があります。
読みやすいように書いてください。このようなことについて心配する必要はありません。
当然のことですが、変数を作成すると変数が作成されます。これはメモリを消費し、実行時に時間がかかります。その後、ガベージコレクションに時間がかかるか、関数がリークした場合にメモリを解放しません。
ただし、違いに気付くことはありません。そのレベルではパフォーマンスを測定できません。経験則:変数が本当に必要な場合、またはコードの読みやすさが向上する場合は、変数を使用します。
違いはごくわずかですが、答えは実際には実装固有です。JavaScriptエンジンは、割り当て方法がほぼ確実に異なります。ただし、ほとんどの場合、違いは他のほとんどの言語と同様であり、デバッガーでメモリとプロセッサのレジスタを調べることができます。1つのシナリオを調べてみましょう。
var sum = x+2;
someFunction(sum);
これにより、合計を保持するためのメモリが割り当てられます。合計は、関数がスコープ内にある限りハングします。関数がクロージャになると、これは永遠に続く可能性があります。再帰関数では、これは重要である可能性があります。
someFunction(x+2);
ほとんどの言語では、これはスタック上でx + 2を計算し、その結果をsomeFunctionに渡します。記憶は残っていません。
答えは、関数の戻り値についてもまったく同じです。
要約すると:
正確な答えは、JavaScriptエンジンの実装によって異なります。
ほとんどの場合、パフォーマンスの違いに気付くことはありません。
結果を再利用する場合、またはデバッガーで結果を簡単に調べたい場合は、変数を使用できます。
それは主に個人的な好みの問題です。
スコープが現在の関数を超えないローカル変数を作成しても、ローカル変数を作成せず、関数の引数として式を直接書き込む場合と比較して、コストは発生しません。someFunction(x*2)
実際、JavaScriptコンパイラによって内部的に変数を結果にバインドするコードに書き込みが変換されないことは何もx*2
わかりません。実際、多くのコンパイラとJITは、中間表現の1つとしてSSAを使用します。この場合、変数は次のようになります。常にすべてのサブ式の結果にバインドされます。関連するウィキペディアのエントリを参照してください。閉鎖の有無にかかわらず、違いはありません。
新しい変数を導入するか、式を引数として直接記述するかを選択する際に関係する必要がある2つの関連する質問は次のとおりです。
読みやすさ:式の結果に名前を付けると、式が何を計算しているかが明確になりますか。
式を評価するコスト:式を複数回作成する場合は、変数を結果にバインドすると、毎回結果を再計算しないように再利用できます。これは、式の計算に長い時間がかかると予想される場合にのみ関係します。
関数定義内に一度だけ式を記述する必要がある場合、変数を結果にバインドすると、結果が厳密に必要な期間よりも長くメモリに存在する可能性がありますが、これはほとんどの場合完全に無関係です。ほとんどの関数呼び出しは非常に短命です。多くの場合、結果は多くのメモリを消費せず、スタックに割り当てられたメモリは関数の終了時に再利用され、ヒープに割り当てられたメモリはその後すぐにガベージコレクタによって再利用されます。