일부 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;
}
time''의 초기 출력 컨텍스트 전환이 있다면 당신처럼, 시간이 걸릴 수있는 프로그램 끝까지 프로그램 시작부터 시계 시간이 될 것입니다 :
어떤 극적인 차이가 내 바탕 화면에 관찰되지 말하는.스레드가 잠자고있는 동안 자고있을 가능성이 높기 때문에 high_resolution_clock을 신뢰합니다. 나는 당신이 코드를 보여주고 싶지 않다고 말한 것을 알고 있지만, 당신이 타이밍을 어떻게 계측했는지 정확하게 알면 좋을 것이다. 그래서 코드가 좋다. – AndyG
내가 찾은 high_resolution_clock의 모든 자습서와 크게 다르지 않은 타이밍을 업로드했습니다. – pippin1289
내가 틀렸다면 나를 고쳐 주겠지 만 코드의 가정은 틱 수가 초를 나타내는 것입니까? 'std :: chrono :: duration_cast (end_hrc-start_hrc)'를 사용하면 출력은 어떻게됩니까? –
AndyG