2

私がやろうとしていることは、次のことを避けることです。

if(*ptr > 128) {
   number = 5;
}

ブランチがどちらの方向に進むかについて明確なパターンがない場合、このようなコードのパフォーマンスは低下します。私が思いついたのはこれです:

int arr[] = { number, 5 };
int cond = *ptr > 128;
number = arr[cond];

私のテストに基づくと、入力がランダムな場合の条件付き実行の2倍以上の速度で実行されます。私が疑問に思っているのは、おそらくビット演算子を使用して、これを行うためのより賢い方法があるかどうかです。

4

1 に答える 1

5

賢いコンパイラーは、これを適切な最適化設定で条件付きの動きに確実にコンパイルする必要があります。分解を確認してください。

このブランチレスソリューションがあります:

int mask = -(*ptr > 128);
number = (number & mask) | (5 & ~mask);

最後の行も

number = ((mask & (number ^ 5)) ^ 5);

1つ少ない操作を使用する場合。ただし、エンプターに注意してください。コンパイラーは、これらのいずれかをほぼ同様に最適化することはできません。コンパイラが最適化を実行できないことが特にわかっている場合を除いて、この特定の最適化をコンパイラに任せるのが最善です(その場合、コンパイラのバージョンまたはフラグを確認することをお勧めします)。

于 2012-09-26T23:48:00.793 に答える