2014-07-06 2 views
0

내 코드에서 실행 시간을 확인하려고합니다. 코드는 내 시도가 Project Euler Problem 5입니다. 실행 시간을 출력하려고하면 0ns가됩니다.런타임 (나노초)을 볼 수없는 이유는 무엇입니까?

#define MAX_DIVISOR 20 

bool isDivisible(long, int); 

int main() { 

auto begin = std::chrono::high_resolution_clock::now(); 

int d = 2; 
long inc = 1; 
long i = 1; 
while (d < (MAX_DIVISOR + 1)) { 
    if ((i % d) == 0) { 
     inc = i; 
     i = inc; 
     d++; 
    } 
    else { 
     i += inc; 
    } 
} 
auto end = std::chrono::high_resolution_clock::now(); 

printf("Run time: %llu ns\n", (std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count())); // Gives 0 here. 
std::cout << "ANS: " << i << std::endl; 

system("pause"); 
return 0; 

}

+0

그것은 당신의 시계 해상도가 충분히 높지 않을 가능성이 있습니다 :

는 여기가 가능한 구현을 참조하는 방법의 코드입니다. 1000 초 동안 기다리는 간단한 루프로 테스트를 수행하여 아이디어를 얻으십시오. Windows에서는 예를 들어 15ms의 해상도를 갖습니다. 다른 방법 : 프로그램을 10000 번 실행하고 전체 실행 시간을 조정하십시오. – Christophe

+0

Windows OS 환경에서는 적절한 나노초 솔루션을 얻지 못할 것입니다. 희망은 +/- 100ms입니다. –

+1

@ πάνταῥε μ 당신은 μs (마이크로 초) 또는 ms (밀리 초)를 의미합니까? – Christophe

답변

1

추정치가 정확하지 않을 경우 더 좋은 방법은 측정 프로그램의 CPU 시간이입니다. 다른 프로세스도 프로세스와 동시에 실행되므로 측정하려고하는 시간이 크게 걸릴 수 있습니다 CPU에 민감한 작업이 프로세스와 병렬로 실행되는 경우 영향을받습니다.
코드 성능을 평가하려면 이미 구현 된 프로파일 러를 사용하는 것이 좋습니다.

작업을 고려할 때 OS가 시간에 대해 필요한 정밀도를 제공하지 않으면 예상되는 총 시간을 늘려야합니다. 가장 좋은 방법은 프로그램을 실행하여 N 번 & 평균을 계산하는 방법입니다. avareging을 통해 - 프로세스와 동시에 실행되는 CPU의 민감한 작업에서 발생한 오류를 제거 할 수 있습니다.

#include <iostream> 
using namespace std; 

#define MAX_DIVISOR 20 

bool isDivisible(long, int); 

void doRoutine() 
{ 
    int d = 2; 
    long inc = 1; 
    long i = 1; 
    while (d < (MAX_DIVISOR + 1)) 
    { 
     if (isDivisible(i, d)) 
     { 
      inc = i; 
      i = inc; 
      d++; 
     } 
     else 
     { 
      i += inc; 
     } 
    } 
} 

int main() { 

auto begin = std::chrono::high_resolution_clock::now(); 
const int nOfTrials = 1000000; 

for (int i = 0; i < nOfTrials; ++i) 
    doRoutine(); 

auto end = std::chrono::high_resolution_clock::now(); 

printf("Run time: %llu ns\n", (std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count()/ nOfTrials)); // Gives 0 here. 
std::cout << "ANS: " << i << std::endl; 

system("pause"); 
return 0; 
+0

내 루프에서 1 백만회를 시도했습니다. 나는 시간이 1 백만 변하고 504 ns를 얻었다. 이것은 합리적인 시간인가? – MichaelMitchell

+0

@MichaelMitchell 비교할 표준이 필요하기 때문에 모르겠다.구현 한 알고리즘이 효율적인지 여부를 평가하지 않으면 입력 크기와 관련하여 접근 횟수와 계산 횟수를 변경해야합니다 (큰 O 표기법 참조). 왜냐하면 시간은 - 당신이 그것을 실행하는 컴퓨터에 따라 다르지만, 작업의 수는 컴퓨터에 독립적입니다. –

+1

@MichaelMitchell 예. 요즘은 합리적인 수치입니다. (백만 건이 아니라 1 건의 간섭이 504 나노초라고 가정합니다.) – Christophe

2

이제 표준 : 크로노 :: high_resolution_clock ::의 타이밍 resolulution()는 시스템에 의존한다. (: 여기 좀 더 정확한 버전이 편집) :

현재 코드의 작은 조각 크기의 순서를 알 수

chrono::nanoseconds mn(1000000000); // asuming the resolution is higher 
for (int i = 0; i < 5; i++) { 
    using namespace std::chrono; 
    nanoseconds dt; 
    long d = 1000 * pow(10, i); 
    for (long e = 0; e < 10; e++) { 
     long j = d + e*pow(10, i)*100; 
     cout << j << " "; 
     auto begin = high_resolution_clock::now(); 
     while (j>0) 
      k = ((j-- << 2) + 1) % (rand() + 100); 
     auto end = high_resolution_clock::now(); 
     dt = duration_cast<nanoseconds>(end - begin); 
     cout << dt.count() << "ns = " 
      << duration_cast<milliseconds>(dt).count() << " ms" << endl; 
     if (dt > nanoseconds(0) && dt < mn) 
      mn = dt; 
    } 
} 
cout << "Minimum resolution observed: " << mn.count() << "ns\n"; 
k는 것을 방지하기 위해 글로벌 volatile long k;입니다

최적화 도구가 너무 많이 간섭합니다.

Windows에서는 15ms를 얻습니다. 그런 다음 플랫폼 별 대안이 있습니다. Windows의 경우 10μs 이하의 시간 범위 (여기 http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408%28v=vs.85%29.aspx 참조)를 측정 할 수 있지만 여전히 나노초 범위가 아닌 고성능 클록이 있습니다.

코드가 매우 정확하게 시간이 걸리도록하려면 큰 루프를 다시 실행하고 총 시간을 반복 횟수로 나누십시오.

관련 문제