基准测试(for循环的执行时间):我们不应该随着for循环限制的增加而具有单调递增函数

Han*_*Goc -2 c++ time benchmarking

我想对for循环进行基准测试.我决定将for循环中的变量增加100并相应地测量时间.

#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;
}
Run Code Online (Sandbox Code Playgroud)

图形

y轴表示以秒为单位的时间,x轴表示迭代的增加限制.

假设:随着限制的增加,时间应该增加.我们应该有一个严格增加的功能

曲线显示其他方面.为什么0.00001循环5300 时间和循环时间需要几0.00002秒钟5400.正如您在图表中看到的那样,我们有很多时候都有这个东西.

在此输入图像描述

R. *_*des 6

假设:

假设是对现象的解释.既然你在实际观察任何现象之前就已经提出这个问题,那么这不是一个假设.另外,如果你声称它直接与观察结果相矛盾,它就不能作为对它们的解释,因此不是假设.

随着限制的增加,时间应该增加.我们应该有一个严格增加的功能

据我所知,观察结果与此并不矛盾.

通过时钟的有限分辨率可以很容易地解释曲线中的伪影:它显然无法测量小于1e-5的时间差; 小于1e-5的变化将显示为平线或离散的1e-5变化.