2016-09-12 5 views
4

일부 C++ 코드의 타이밍에 대한 간단한 테스트를 실행 중이 었으며 100 % 긍정적 인 결과가 아닌 아티팩트를 조사했습니다.코드에서 Linux 시간과 성능 시계의 차이

설정

내 코드는 경과 시간을 측정하기 위해 C++ 11 high_resolution_clock를 사용합니다. 또한 리눅스의 time 명령 (/usr/bin/time)을 사용하여 프로그램 실행을 마무리합니다. 내 프로그램의 경우 high_resolution_clock은 ~ 2s를보고하고 time은 ~ 7s (~ 6.5s 사용자와 ~ .5s 시스템)를보고합니다. 또한 verbose 옵션을 사용하여 내 프로그램이 1 개의 자발적 컨텍스트 스위치와 10 개의 비자 발성 컨텍스트 스위치 (/usr/bin/time -v)를 사용하여 CPU의 100 %를 사용함을 보여줍니다.

질문

내 질문이 OS 시간 측정 및 성능 시간 측정과 같은 극적인 변화를 원인이 무엇입니까? (time -v에서 언급 한 바와 같이), 나는이 차이를 가정하고 운영 체제 내 지식을 통해

내 초기 생각

는 전적으로 상황에 의해 발생하는 다른 프로그램으로 전환합니다.

이 차이가 유일한 이유입니까? 코드 성능을 볼 때 내 프로그램이나 시스템에서보고 한 시간을 신뢰해야합니까?

다시 말하면 내 프로그램의 CPU 사용보다 시간이 많이 걸리기 때문에 내 프로그램에서 계산 된 시간을 Linux의 시간보다 신뢰하는 것으로 가정합니다.

주의 사항

  • 가 손에서이 문제에 정말 관련이없는 것처럼 내가 코드를 게시하고 있지 않다. 당신이 알고 싶다면 100,000,000 번 임의의 부동 소수점 산술 연산을 수행하는 간단한 테스트입니다.

  • 내 C++ 코드의 다른 시계가 차이 상황 (this stack overflow question)에 다소 적합 할 수도 있음을 알고 있습니다. High_resolution_clock은 예제 일뿐입니다.

편집 : 코드의 요청에 따라

#include <chrono> 
#include <cstdlib> 
#include <iostream> 
#include <vector> 

using namespace std; 
using namespace std::chrono; 

int main() { 
    size_t n = 100000000; 

    double d = 1; 

    auto start_hrc = high_resolution_clock::now(); 

    for(size_t i = 0; i < n; ++i) { 
    switch(rand() % 4) { 
     case 0: d += 0.0001; break; 
     case 1: d -= 0.0001; break; 
     case 2: d *= 0.0001; break; 
     case 3: d /= 0.0001; break; 
    } 
    } 

    auto end_hrc = high_resolution_clock::now(); 
    duration<double> diff_hrc = end_hrc - start_hrc; 
    cout << d << endl << endl; 
    cout << "Time-HRC: " << diff_hrc.count() << " s" << endl; 
} 
+0

time''의 초기 출력 컨텍스트 전환이 있다면 당신처럼, 시간이 걸릴 수있는 프로그램 끝까지 프로그램 시작부터 시계 시간이 될 것입니다 :

어떤 극적인 차이가 내 바탕 화면에 관찰되지 말하는.스레드가 잠자고있는 동안 자고있을 가능성이 높기 때문에 high_resolution_clock을 신뢰합니다. 나는 당신이 코드를 보여주고 싶지 않다고 말한 것을 알고 있지만, 당신이 타이밍을 어떻게 계측했는지 정확하게 알면 좋을 것이다. 그래서 코드가 좋다. – AndyG

+0

내가 찾은 high_resolution_clock의 모든 자습서와 크게 다르지 않은 타이밍을 업로드했습니다. – pippin1289

+0

내가 틀렸다면 나를 고쳐 주겠지 만 코드의 가정은 틱 수가 초를 나타내는 것입니까? 'std :: chrono :: duration_cast (end_hrc-start_hrc)'를 사용하면 출력은 어떻게됩니까? – AndyG

답변

0

내 질문이 OS 시간 측정 및 성능 시간 측정과 같은 극적인 변화를 원인이 무엇입니까?

응용 프로그램을 시작하는 데 시스템이 오래 걸리는 것처럼 보입니다. 리소스 문제 일 가능성이 있습니다 : 사용 가능한 메모리 (스와핑)가 충분하지 않거나 과다하게 참여한 CPU가 아닙니다.

Time-HRC: 1.39005 s 
real 0m1.391s 
user 0m1.387s 
sys  0m0.004s