何百万回も繰り返すループがあるとしましょう。このループ内に関数呼び出しがあります。
この関数内で、最初に作成された一時変数を操作する必要があります。さて、どちらが良いですか:
a) コードの先頭に一時変数を作成し、ループの先頭で初期化し、関数パラメータとして渡します
b) 呼び出された関数の先頭にローカル一時変数だけを作成しますか?
これは答えられる質問ですか?どのポイントがより良い練習と見なされるか、またはどちらがより速いかを知りたいです。
何百万回も繰り返すループがあるとしましょう。このループ内に関数呼び出しがあります。
この関数内で、最初に作成された一時変数を操作する必要があります。さて、どちらが良いですか:
a) コードの先頭に一時変数を作成し、ループの先頭で初期化し、関数パラメータとして渡します
b) 呼び出された関数の先頭にローカル一時変数だけを作成しますか?
これは答えられる質問ですか?どのポイントがより良い練習と見なされるか、またはどちらがより速いかを知りたいです。
変数が関数の外で必要ない場合は、関数内にある必要があります。これにより、コンパイラはコードを最適化するだけでなく、コードを最も読みやすく使いやすいものにするという最善の仕事を行うことができます (これは一般に、「可能な限り最小のスコープで変数を宣言する」ことに当てはまります。毎回関数の先頭にある変数が最適なオプションです)。
パフォーマンスの観点からは、変数を関数に渡すことは、ローカル変数を使用することと同等か、それより劣ります。[もちろん、コンパイラはすべてをインライン化する可能性があり、どちらの場合もまったく同じコードになりますが、それはコンパイラとコードに依存します]。
他の人が述べたように、ポインターをローカル変数に渡すと、ポインターにアクセスして値を取得するための「ペナルティ」が発生します。大きな違いはないかもしれませんが、ほぼ間違いなく何らかの違いがあります。これは間違いなく最後の手段です。[変数が LARGE の場合、コピーを関数に渡すオーバーヘッドは、ポインターのオーバーヘッドよりも依然として悪い可能性があることに注意してください。int
しかし、それがorのような単純な型であると仮定するとfloat
、ポインタには顕著なオーバーヘッドがあります]。
パフォーマンスに関する疑問がある場合はいつでも、コードをベンチマークする必要があります。並べ替えのアルゴリズムなどの選択肢がある場合は、インターネットで他の人に尋ねることは価値があるかもしれませんが、より微妙な違いで「これを行う方が良いか、あれを行う方が良いか」の場合、違いはしばしば小さく、特定のコンパイラが行うことは、「理論的にどちらが優れているか」よりもはるかに影響力があります。