ので、このルールは、高繰り返しのうち、if
文を引くしようとするがありますループ:関数ポインタを使用して文をより効率的にする場合は、カットしていますか?
for(int i = 0 ; i < 10000 ; i++)
{
if(someModeSettingOn) doThis(data[i]) ;
else doThat(data[i]) ;
}
彼らはそれが外にif文を入れて、それを分割すると良いでしょう、と言う:
if(someModeSettingOn)
for(int i = 0 ; i < 10000 ; i++)
doThis(data[i]) ;
else
for(int i = 0 ; i < 10000 ; i++)
doThat(data[i]) ;
(もしあなたが "Ho!自分自身を最適化しないでください!コンパイラはそれをやります!"と言っているでしょうか?)もちろん、オプティマイザがこれを行うかもしれません。しかし、Typical C++ Bullshit(私はと同義ではありません。彼のポイント、例えば仮想関数に対する彼の態度)Mike Actonは "なぜコンパイラがあなたに何かを推測させるのですか?はを知っていますか? 。
なぜ代わりに、関数ポインタを使用していない?
FunctionPointer *fp ;
if(someModeSettingOn) fp = func1 ;
else fp = func2 ;
for(int i = 0 ; i < 10000 ; i++)
{
fp(data[i]) ;
}
をポインタを機能させるに隠されたオーバーヘッドのいくつかの種類がありますか?それはまっすぐ関数を呼び出すように効率的ですか?
あなたは自分の状況でそれをプロファイルし、参照する必要があります。分岐予測は、一貫した 'if'ステートメントのオーバーヘッドを減らすために大きく貢献しました。 –