I have a switch
statement in some time-critical code. I was trying to optimize it with __builtin_expect
, but it does not seem to be working. I'm wondering if anyone can tell me if I'm missing some detail, or if the compiler simply does not optimize for it. I have tried the following on my host machine:
int main() {
volatile int v=0;
long i = 0;
for (i=0; i<1000000000L; i++) {
switch(__builtin_expect(v, EXPT)) {
case 7:
v=7;
break;
default:
v=7;
break;
}
}
return v;
}
Then I compile and run as follows:
~/code/builtinexpect> gcc bie.c -o bie -D EXPT=0 && time ./bie
real 0m2.092s
user 0m2.086s
sys 0m0.000s
~/code/builtinexpect> gcc bie.c -o bie -D EXPT=7 && time ./bie
real 0m2.092s
user 0m2.086s
sys 0m0.000s
I am using GCC version 4.5.1.
GCC does not support this on any architecture I'm aware of. If you have a switch
statement which strongly favors a particular case, your best recourse is to do an if ... else switch ...
statement. This would result in the optimization you're looking for.
Both case
branches (and therefore all cases) do the same thing, so the compiler is free to replace the whole switch statement with v=7
. Even if it doesn't (without optimization), would you expect any real difference in timing?
But more to the point, __builtin_expect
evaluates as (v == EXPT)
, either (0)
or (1)
, so case 7:
will never be taken.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With