본문 바로가기

System/Performance (성능 측정)

Base Operation Performance Measurement

문제: 1064 [기초-삼항연산] 

입력된 세 정수 a, b, c 중 가장 작은 값을 출력하는 프로그램을 작성해보자.


Code

//3항연산자를 통해 최솟값을 출력
#include <stdio.h>
int main(){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    printf("%d",(a<b?a:b)<c?(a<b?a:b):c);
}

//if문을 활용해 최솟값을 출력
#include <stdio.h>
int main(){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    if(a>=b){
        if(b>=c) printf("%d",c);
        else printf("%d",b);
    }
    else if(b>=a){
        if(a>=c) printf("%d",c);
        else printf("%d",a);
    }
    else if(c>=a){
        if(a>=b) printf("%d",b);
        else printf("%d",a);
    }
}

Execution Time

a,b,c를 각각 rand()함수를 통해 받은후 최솟값을 찾는 위의 코드를 통해 수행시간을 각각 계산해 보았다

3항 연산을 통해 값을 100번 받은 실행시간                                               if문을 통해 값을 100번 받은 실행시간
3항 연산을 통해 값을 500000번 받은 실행시간                                           if문을 통해 값을 500000번 받은 실행시간
3항 연산을 통해 값을 5000000번 받은 실행시간                                           if문을 통해 값을 5000000번 받은 실행시간

 


Conclusion

처음 C언어에 대한 공부를 시작하였을때, if문의 가독성과 접근성으로 인해 3항연산을 알고는 있었지만, 직접 사용 할 기회가 없었다. 하지만 최근 알고리즘 공부를 시작하면서 기초에 대해 복습하던 도중에, if문에 비해 코드의 길이적인 측면에서 많은 단축이 이루어질 수 있다는 것을 볼 수 있었고, if문의 사용에 분기예측에 드는 비용이 감소할 것이라는 예상을 했었기에 성능에 영향을 미칠 수 있다는 생각이 들었다.

 

그래서 시스템 프로그래밍 수업시간에 배운 gettimeofday() 함수를 이용해 정말 간단한 수행 시간에 대한 성능을 비교 해 보았는데, 이는 내가 예측한 결과와 다른 결과가 나왔다.

 

그에 대한 개인적인 생각으로는 if문의 분기예측에 대한 비용과 3항연산의 연산에 사용되는 비용이 비슷하거나, 혹은

3항연산의 내부 설계과정에서 이와 비슷한 비용의 일련의 과정이 존재하기 때문이라는 생각이 들었다.

 

3항연산의 내부구조를 확인 할 수 있다면 좀 더 명확한 해답을 얻을 수 있을 거 같아, 기회가 되어 3항연산의 설계구조를 확인할 수 있다면 이 부분에 대한 해답을 얻을 것이다.