2016-07-11 2 views
-2

for 루프를 벤치마킹하고 싶습니다. for 루프의 변수를 100 씩 증가시키고 그에 따라 시간을 측정하기로 결정했습니다.벤치마킹 (for 루프의 실행 시간) : for 루프의 한계가 증가함에 따라 단조 증가 함수를 사용하지 말아야합니다.

#include <cstdio> 
#include <ctime> 
#include <time.h> 
#include <iostream> 
#include <random> 
#include <iomanip>  // std::setprecision 
using namespace std; 

double difference(timespec start, timespec end); 

int main() 
{ 
    timespec time1, time2; 

    for(int limit = 0; x < 100000; limit+= 100) 
    { 
     clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); 
     int temp = 0; 
     for (int i = 0; i< limit; i++) 
     temp+=temp; 

     clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); 
     std::cout << std::fixed; 
     std::cout << std::setprecision(5); 
     cout<<x <<" " << difference(time1,time2)<<endl; 
    } 

    return 0; 
} 

double difference(timespec start, timespec end) 
{ 
    timespec temp; 
    if ((end.tv_nsec-start.tv_nsec)<0) { 
     temp.tv_sec = end.tv_sec-start.tv_sec-1; 
     temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; 
    } else { 
     temp.tv_sec = end.tv_sec-start.tv_sec; 
     temp.tv_nsec = end.tv_nsec-start.tv_nsec; 
    } 
    return (temp.tv_sec + temp.tv_nsec)/1000000000.00; 
} 

그래프

y 축은 x 축에는 반복의 증가하는 한계를 나타내는 시간 (초)을 나타낸다.

가설 : 증가하는 제한으로 시간이 증가해야합니다. 우리는 curvse이 otherswise을 보여주는 엄격하게 증가 기능을

이 있어야합니다. 왜 0.00001 초 걸려서 5300 번 걸리고 0.00002 초 걸리면 루프가 5400 번 걸리는 겁니까? 그래프에서 볼 수 있듯이 우리가 이걸 가지고있는 시간이 많이 있습니다.

enter image description here

+10

내가 어디서부터 시작해야할지조차 모른다는 것은 너무 많은 것들이 잘못되었습니다. 1) 아마도 최적화 컴파일을하고있을 것입니다. 그렇지 않으면 DCE로 인해 0에 가까운 평평한 선이됩니다. 2) 부호있는 정수 오버 플로우는 UB입니다. 이것은 보통 무해하기는하지만 일부 컴파일러 (즉 GCC)는 예기치 않은 일을하는 것으로 알려져 있습니다. 3) 벤치 마크 루프가 너무 작아 의미가 없습니다. 작은 제한의 경우 루프를 실행하는 것보다 시간이 오래 걸립니다. – Mysticial

+3

측정하는 값에서 약간의 소음이 데이터에 들어올 것으로 예상됩니다. –

답변

6

가설 :

가설이 현상에 대한 설명입니다. 당신이 어떤 현상을 실제로 관찰하기 전에 이것을 놓고 있기 때문에, 그것은 가설이 될 수 없습니다. 또한, 당신이 주장하는 것처럼, 그것이 관찰과 직접적으로 모순된다면, 그것들은 설명을위한 것이 될 수 없으므로 가설이 아닙니다.

시간이 증가함에 따라 시간이 증가해야합니다. 우리는 엄격하게 증가 기능

그리고 지금까지 내가이 모순되지 않는 관찰을 말할 수 있어야합니다.

곡선의 아티팩트는 시계의 유한 해상도로 쉽게 설명됩니다. 1e-5보다 작은 시간차는 분명히 측정 할 수 없습니다. 1e-5보다 작은 변동은 평평한 선 또는 개별 1e-5 변경으로 표시됩니다.

2

당신은 명확하게 당신이 당신의 측정의 정확도 벽에 부딪 것을 의미 곡선의 단계를 볼 수 있습니다. 즉, clock_gettime 호출은 더 이상 정확한 값을 제공 할 수 없으며 실행 사이에 충분한 차이가 없으므로 동일한 시간 값을 여러 번 반복 측정했습니다.

작은 피크와 밸리는 반올림 오류로 설명 할 수 있습니다. 한 번 당신은 시계 '틱'바로 전에 clock_gettime을 호출했고 '틱'직후에 다음에 호출되었습니다. 이것은 처음으로 하나의 '진드기'로 더 짧게 보일 수 있습니다. 여기서 '진드기'는 시계의 정확도입니다.