次のようなコードがあります。
void function(int parameter)
{
for( ... ) // a big loop
{
double a = ...;
for( ... ) // a big loop
{
double b = ...;
double value;
if(parameter == 1)
value = some_math_expression_1(a, b);
else if(parameter == 2)
value = some_math_expression_2(a, b);
...
}
}
}
アイデアは、パラメータに応じて、いくつかの数式をa
andに適用したいということですb
。この関数は何度も実行され、高速である必要があります。各反復での条件付き分岐によって、節約できるオーバーヘッドが導入されるのではないかと考えています。
今、私は次のようなコードを書きました:
void function(int parameter)
{
if(parameter == 1)
function1();
else if(parameter == 2)
function2();
else
...
}
すべてのコードを繰り返すと、数式を直接適用できるようになりますfunctionX()
。明らかな問題は、コードの一部を変更したい場合、何度か変更を行わなければならないことです (現在、10 個ほどの数式があります)。
のオーバーヘッドを回避するには、どのようなアプローチを使用できfunction
ますか?
some_math_expression_X
関数へのポインターを渡すとどうなりますfunction
か (関数呼び出しの条件を変更します)。
関数全体をマクロ (uf) としてコーディングし、数式をパラメーターとして設定するとどうなりますか?
テンプレートを使用して数式をインライン関数へのポインターとして渡すとどうなりますか (これは可能ですか)?
編集:ご回答ありがとうございます。あなたが提案している方法を使用できることはわかっています(/関数の配列へのポインター、または分岐予測子に依存しています)。ただし、オーバーヘッドを回避するという点で何が優れているかについての洞察はありますか? 数式は非常に単純で ( のようなものa*b
)、長いループに加えて、function
何度も呼び出されます (分岐予測は呼び出し間で「存続」しますか?)。