2016-12-24 1 views
-2

이 두 프로그램 중 더 빠르게 실행되는 프로그램은 무엇입니까? 첫 번째는 변수를 다시 할당하는 두 개의 함수에 대한 포인터의 배열이고, 두 번째는 동일한 방식으로 변수를 다시 할당하는 두 개의 사례의 전환입니다.스위치를 사용하거나 함수 배열을 정의하는 것이 더 빠릅니까?

1 :

#include <iostream> 

void w (int &z); 
void y (int &z); 

int main(int argc, const char * argv[]) { 
    void (*p[2]) (int &a) = {w,y}; 
    int s = 0; 
    for(int i=0;i<1000;i++) { 
     p[s](s); 
    } 
    return 0; 
} 

void w (int &z) { 
    z = 1; 
} 

void y (int &z) { 
    z = 0; 
} 

2 :

일반적으로
#include <iostream> 

int main(int argc, const char * argv[]) { 
    int s = 0; 
    for(int i=0;i<1000;i++) { 
     switch (s) { 
      case 0: 
       s = 1; 
       break; 
      case 1: 
       s = 0; 
       break; 
     } 
    } 
    return 0; 
} 

, 당신은 컴파일에서 알고있는 경우 switch 문을 정의하는 대신 함수 포인터의 배열을 사용하는 경우 프로그램을 더 빠르게 수행 변수의 현재 값에 따라 수행 할 지침은 무엇입니까? 또는 switch 문이 더 빠릅니까? 아니면 둘 다 똑같습니까?

+7

이미 최적화 수준을 사용하여 측정 했습니까? –

+1

첫 번째 예제는 내 피부를 크롤링합니다. – DeiDei

+0

표시되는 두 프로그램은 실제로는 동일하지 않으며 엄격하게 비교할 수 없습니다. –

답변

1

함수 포인터가 함수 호출과 함수 호출의 오버 헤드를 갖기 때문에 switch 문이 더 빠를 것이라고 생각합니다. 스위치는 바로 점프 테이블 일뿐입니다.

1

switch 문장이 더 빨라지고 이해하기가 훨씬 쉽습니다. 적어도,이 경우에. 대부분의 경우 가능성이 있습니다.

컴파일러가 전체 루프를 완전히 삭제할 수 있기 때문에이 경우 속도가 빨라집니다. 모든 코드가 지역 변수에만 영향을 미치므로 프로그램의 관찰 가능한 동작을 변경하지 않고도 제거 할 수 있습니다.

그리고 이것은 switch 문이 일반적으로 더 빠를 이유를 강조합니다. 많은 경우가있을 경우 점프 테이블로 구현되며 컴파일러는 모든 정보를 손끝에서 처리 할 수 ​​있으며 속도상의 이유로 코드를 삭제하거나 이동할 수있는 모든 종류의 트릭을 수행 할 수 있습니다.

함수 포인터 버전에서는 컴파일러가 함수 포인터를 사용하여 배열을 초기화하고 아무 것도 변경하지 않거나 그 주소를 아무 것도 통과하지 못하도록 다른 것을 변경할 수 있다는 것을 깨닫기에 충분히 똑똑해야합니다. 또한 호출되는 모든 함수를 살펴보고 전달되는 참조에 아무런 영향을 미치지 않는다는 것을 깨닫게됩니다. 많은이 필요합니다.

그리고 더 나쁜 점은 함수 포인터 버전이 사람이 이해하기 힘들다는 것입니다. 그리고 당신이 신경 쓰지 않는다면 왜 어셈블리 언어로 쓰지 않습니까? 아니면 원시 프로세서 opcode로 쓰는 것이 더 낫지는 않습니까?

관련 문제