C++ 基准测试(for循环的执行时间):不应';t随着for循环极限的增加,我们有一个单调递增函数

C++ 基准测试(for循环的执行时间):不应';t随着for循环极限的增加,我们有一个单调递增函数,c++,time,benchmarking,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 differ

我想对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;
}
#包括
#包括
#包括
#包括
#包括
#include//std::setprecision
使用名称空间std;
双差(timespec开始、timespec结束);
int main()
{
timespec time1、time2;
对于(整数极限=0;x<100000;极限+=100)
{
时钟获取时间(时钟处理时间ID和时间1);
内部温度=0;
对于(int i=0;istd::cout您可以清楚地看到曲线中的步骤,这意味着您在测量中遇到了一道精度墙。换句话说,
clock\u gettime
调用无法给您提供任何更精确的值,并且多次迭代测量了相同的时间值,因为运行之间没有足够大的差异

小波峰和波谷可以用舍入误差来解释。前一次你在时钟“滴答”之前调用了
clock\u gettime
,下一次它在“滴答”之后调用。这可能导致第一次看起来短了一个“滴答”。这里的“滴答”是时钟的精度

假设:

假设是对一种现象的解释。因为你在实际观察任何现象之前就提出了这一点,所以它不可能是一个假设。此外,如果,正如你所说,它直接与观察结果相矛盾,它就不能作为对观察结果的解释,因此也不是一个假设

随着限制的增加,时间应该增加。我们应该有一个严格的递增函数

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


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

这里有太多错误,我甚至不知道从何处开始。1)您可能正在使用Optimization进行编译ns关闭。否则,由于DCE,它将是一条接近零的平线。2)有符号整数溢出是UB。虽然这通常是无害的,但一些编译器(即GCC)你的基准循环太小,没有意义。对于较小的限制,获取时间要比运行循环花费更长的时间。在你测量的值上,你应该预期一些噪声会潜入数据中。