我在一些时间关键代码中有一个switch
语句。我试图用__builtin_expect
来优化它,但它似乎不起作用。我想知道是否有人可以告诉我,我是否遗漏了一些细节,或者编译器是否只是没有针对它进行优化。我在我的主机上尝试了以下内容:
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;
}
然后我编译并运行如下:
~/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
我使用的是GCC 4.5.1版。
答案 0 :(得分:4)
GCC不支持我所知道的任何架构。如果您有switch
声明强烈支持特定情况,那么您最好的办法就是做if ... else switch ...
声明。这将导致您正在寻找的优化。
答案 1 :(得分:3)
两个case
分支(因此所有个案例)都做同样的事情,因此编译器可以用v=7
替换整个switch语句。即使它没有(没有优化),你会期望在时间上有任何真正的差异吗?
但更重要的是,__builtin_expect
评估为(v == EXPT)
,(0)
或(1)
,因此case 7:
永远不会被采用。< /秒>