2014-02-06 49 views
5

我有一个switch语句在一些时间关键的代码。我试图用__builtin_expect来优化它,但它似乎没有工作。我想知道是否有人可以告诉我,如果我错过了一些细节,或者如果编译器没有为它优化。我已经试过我的主机上执行以下操作:你可以使用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版。

+1

在两种情况下,生成的汇编代码如何显示? – Leeor

回答

4

GCC不支持任何我知道的架构。如果您有一个强烈支持特定情况的switch声明,那么您最好的办法是执行if ... else switch ...声明。这会导致您正在寻找的优化。

3

两个case分支(因此所有箱子)做同样的事情,所以编译器是免费的v=7整体更换switch语句。即使它没有(没有优化),你会期望在时间上有什么真正的不同吗?

但更重要的是,__builtin_expect计算为(v == EXPT),无论是(0)(1),所以case 7:将永远不会被取出。

+1

他没有使用编译器优化,因此代码应该有所不同,并可能导致强制性错误预测,但很好地了解布尔值! – Leeor

+3

@Leeor--我喜欢认为一个分支预测器会在10亿次迭代中获得大部分正确的结果:) –

+1

我希望有一个像样的__builtin_expect足够强大,可以强制HW不会。这些HW人需要知道他们的地方:) – Leeor