2014-02-06 5 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; 
} 

은 그럼 컴파일하고 다음과 같이 실행 : 나는 GCC 버전 4.5.1을 사용하고

~/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 

. 컴파일러는 v=7으로 전체 switch 문을 대체 할 무료 그래서

+1

두 경우 모두 생성 된 어셈블리 코드는 어떻게 생겼습니까? – Leeor

답변

4

GCC는 내가 알고있는 모든 아키텍처에서 이것을 지원하지 않습니다. 특정 사례를 강력하게지지하는 switch 성명을 가지고있는 경우 가장 좋은 방법은 if ... else switch ... 성명서를 작성하는 것입니다. 이렇게하면 최적화가 이루어집니다.

3

case 지점 (따라서 모든가지 경우)는 같은 일을. 그것이 (최적화없이)하지 않더라도 타이밍의 실제 차이를 기대합니까?

그러나 점에 더

, __builtin_expect는, (v == EXPT)으로 (0) 또는 (1) 중 평가, 그래서 case 7: 촬영되지 않습니다.

+1

그는 컴파일러 최적화를 사용하지 않으므로 코드가 달라야하고 잘못된 예측이 발생할 수 있지만 부울 값에 대해서는 잘 알아야합니다! – Leeor

+3

@Leeor - 분기 예측기가 수십억 개의 반복을 사용하여 거의 올바르게 처리 될 것이라고 생각하는 것입니다. :) –

+1

HW를 강요하지 않을 정도의 견고한 __builtin_expect를 기대합니다. 그 HW 사람들은 그들의 장소를 알 필요가있다 :) – Leeor

관련 문제