6

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。

4

2 回答 2

5

GCC 在我知道的任何架构上都不支持这一点。如果您有一个switch强烈支持特定案例的陈述,您最好的办法是做一个if ... else switch ...陈述。这将导致您正在寻找的优化。

于 2014-02-13T04:22:29.617 回答
3

两个case分支(因此所有情况)都做同样的事情,因此编译器可以自由地将整个 switch 语句替换为v=7. 即使它没有(没有优化),你会期望时间上有任何真正的差异吗?

但更重要的是,__builtin_expect评估为(v == EXPT)(0)(1),因此case 7:永远不会被采用。

于 2014-02-06T19:35:17.477 回答