2016-10-24 2 views
5

최적화 및 분기 예측 자의 관점에서이 두 코드간에 차이가 있습니까?분기가있는 함수 시작

첫째 :

void think_and_do(){ 
    if(expression){ 
     //Set_A of instructions 
    } 
    else{ 
     //Set_B of instructions 
    } 
} 

int main(){ 
    think_and_do(); 
} 

둘째 : 귀하의 예 만약 내가, think_and_do을 godbolt.org과 main

먼저 관찰에서 테스트를했습니다

void do_A(){ 
    //Set_A of instructions 
} 

void do_B(){ 
    //Set_B of instructions 
} 

int main(){ 
    if(expression){ 
     do_A(); 
    } 
    else{ 
     do_B(); 
    } 
} 
+4

나는 당신이 동일한 코드를 얻을 것이라고 생각 하겠지만 컴파일러 최적화 설정에 달려있다. 둘 다 컴파일하고 어셈블리를 확인할 수 있습니다. – NathanOliver

+1

이것은 경험적으로 가장 잘 대답하는 질문 인 것 같습니다. 반복 가능한 의사 무작위 데이터에 대해 몇 백만 번 반복하고 [측정] (http://stackoverflow.com/questions/11437523/can-i-measure-branch-prediction-failures-on-a-modern-intel -core-cpu? rq = 1). – dlatikay

+1

하나의 키는 두 기능에 필요한 매개 변수 수일 수 있습니다. 함수'think_and_do()'가 모든 매개 변수를 가질 필요가 있고 함수'do_A()'또는'do_B()'만이 모든 매개 변수를 필요로하는 두 번째 경우 (일반적으로'do_A()'가 객체를 생성하고'do_B() '이 객체를 삭제합니다). –

답변

3

사소한 것이 대부분 최적화 된 것입니다.

xor  eax, eax 
    add  rsp, 8 #may or may not be present. 
    ret 

두 번째 관찰 코드가 정확히 주에서 동일 점이다 : 다음 cin없이 두 예제가에 컴파일해야 및 기능 중 어느 것도 호출되지 않으며, 모든 것이 인라인됩니다.

세 번째 관찰은 두 예제들이 발행을 최대한 활용 (그리고 CMP 및 점프의 매크로 융합의 가능성을 무시하는 한 사이클 명령 4의를 채울 수있는 다음 코드

mov  edx, DWORD PTR a[rip] 
    mov  eax, DWORD PTR b[rip] 
    cmp  edx, eax 
    je  .L8 

를 만드는 것입니다). 그들은 문제 대역폭의

cmp  edx, eax 
    je  .L8 

반으로 시작했다면

잠재적 낭비되었을 것입니다.

+1

필자는 요점이 함수를 인라인 할 수없는 경우에 관한 것이라고 생각합니다. – Leeor

+0

@Leeor 결론은 컴파일러가 지정하지 않아도 컴파일러가 인라인을 수행하므로 아무런 차이가 없습니다. – Surt

관련 문제