성능 분석

위와 같은 작은 루프로 계산 속도를 측정했더니 N을 크게 해도 시간이 거의 0이었다. 가장 가능성이 높은 원인은?

start = now();
for (i = 0; i < N; i++)
    x = a * b + i;
end = now();
  1. ACPU가 계산을 순식간에 끝내는 특별한 명령어를 가지고 있기 때문에
  2. Bx의 값이 이후에 사용되지 않아, 컴파일러가 루프의 계산을 불필요하다고 판단해 제거했기 때문에
  3. C시계 함수가 고장났기 때문에
정답과 해설 보기

정답: B. x의 값이 이후에 사용되지 않아, 컴파일러가 루프의 계산을 불필요하다고 판단해 제거했기 때문에

최적화를 활성화한 컴파일러는 결과가 사용되지 않는 계산을 불필요한 코드(데드 코드)로 제거하거나, 루프의 결과를 계산해 상수로 바꿔 놓습니다. 그래서 작은 부분만 떼어 낸 마이크로벤치마크에서는 측정하려는 계산이 실제로는 수행되지 않는 경우가 있습니다. 결과를 출력하거나, volatile이나 컴파일러의 최적화를 막는 기법을 사용하거나, 생성된 기계어를 확인하는 등으로 대처합니다.

  • A. 그런 명령어는 없습니다.
  • B. 올바릅니다. 마이크로벤치마크에서 흔한 함정입니다.
  • C. 시계는 정상적으로 동작하고 있습니다.
이 분야 연습하기 분야로 돌아가기

성능 분석의 다른 문제

  1. 프로그램의 실행 시간을 측정할 때 같은 측정을 여러 번 반복하고 처음 몇 번의 결과를 제외하는 경우가 많은 이유로 올바른 것은?
  2. 매우 짧은 처리의 시간을 한 번만 측정하려 할 때의 문제와 그 대책의 조합으로 올바른 것은?
  3. 실행 시간 측정 방법 중 「벽시계 시간(wall-clock time)」과 「CPU 시간」의 차이로 올바른 것은?
  4. 서버 성능을 나타내는 처리량(throughput)과 지연 시간(latency)에 대한 설명으로 올바른 것은?
  5. 웹 서비스의 응답 시간을 평가할 때 평균값뿐 아니라 99퍼센타일 값(느린 쪽 1%의 경계)을 보는 경우가 많은 이유로 올바른 것은?