2015-01-27 3 views
0

코드의 성능을 측정하려고 할 때 루프에 넣고 백만 시간 동안 반복합니다. 성능을 측정 할 때 루프의 오버 헤드를 줄이는 방법은 무엇입니까?

for i: 1 -> 1000000 
{ 
    "test code" 
} 

그러나 프로파일 링 도구를 사용하여

, 나는 루프의 오버 헤드가 매우 큰 것으로 나타났습니다 크게는 영향을 성능 결과를 그 코드의 조각, 말, 작은 특히 총 경과 시간의 1.5 초와 0.5s의 루프 오버 헤드.

성능을 테스트하는 더 좋은 방법이 있는지 알고 싶습니다. 또는이 방법을 고수해야하지만 같은 루프 아래에서 동일한 코드의 여러 부분을 만들어 성능에서의 가중치를 높여야합니까?

for i: 1 -> 1000000 
{ 
    "test code copy 1" 
    "test code copy 2" 
    "test code copy 3" 
    "test code copy 4" 
} 

또는 총 시간에서 루프 오버 헤드를 뺀 것이 좋습니까? 고마워요!

+1

좋은 컴파일러는 루프를 어느 정도 언 롤합니다. 어떤 종류의 작업을 벤치마킹합니까? –

+0

@ E_net4 표현 템플릿을 테스트 중입니다. 어셈블리를 검사했지만식이 작을 때조차도 풀린 것이 아니라는 것을 발견했습니다. 예를 들어 A + B입니다. – user3156285

+0

어떤 컴파일러를 사용하고 있으며 어떤 플래그를 시도 했습니까? –

답변

1

컴파일러에서 생성 한 어셈블리 목록을 확인해야합니다. 오버 헤드에서 명령어 수를 센다.

  1. 증분 루프 카운터 :

    보통 증분 루프 오버 헤드가 구성된다.

  2. 루프 상단으로 분기.
  3. 한계 대비 카운터 비교.

많은 프로세서에서 이러한 프로세서 명령어가 하나 또는 그 근처에 있습니다. 따라서 명령어의 평균 시간을 알아 내고, 오버 헤드에서 명령어의 수를 곱하면 하나의 반복에 대한 오버 헤드 시간이됩니다.

예를 들어, 명령어 당 평균 100ns의 프로세서와 오버 헤드에 대한 3 가지 명령어에서 각 반복은 반복 당 3 * (100ns) 또는 300ns를 사용합니다. 1.0E6 반복을 감안할 때 3.0E08 나노초는 오버 헤드로 인한 것입니다. 이 양을 측정 값에서 빼내어 루프의 내용을보다 정확하게 측정하십시오.

관련 문제