성능 분석
위와 같은 작은 루프로 계산 속도를 측정했더니 N을 크게 해도 시간이 거의 0이었다. 가장 가능성이 높은 원인은?
start = now();
for (i = 0; i < N; i++)
x = a * b + i;
end = now();
- ACPU가 계산을 순식간에 끝내는 특별한 명령어를 가지고 있기 때문에
- Bx의 값이 이후에 사용되지 않아, 컴파일러가 루프의 계산을 불필요하다고 판단해 제거했기 때문에
- C시계 함수가 고장났기 때문에
정답과 해설 보기
정답: B. x의 값이 이후에 사용되지 않아, 컴파일러가 루프의 계산을 불필요하다고 판단해 제거했기 때문에
최적화를 활성화한 컴파일러는 결과가 사용되지 않는 계산을 불필요한 코드(데드 코드)로 제거하거나, 루프의 결과를 계산해 상수로 바꿔 놓습니다. 그래서 작은 부분만 떼어 낸 마이크로벤치마크에서는 측정하려는 계산이 실제로는 수행되지 않는 경우가 있습니다. 결과를 출력하거나, volatile이나 컴파일러의 최적화를 막는 기법을 사용하거나, 생성된 기계어를 확인하는 등으로 대처합니다.
- A. 그런 명령어는 없습니다.
- B. 올바릅니다. 마이크로벤치마크에서 흔한 함정입니다.
- C. 시계는 정상적으로 동작하고 있습니다.