如何获得一致的执行时间?

how do I get consistent execution times?

我正在准备编码挑战,以最快的速度计算 pi 到第 10000 位数字获胜。在比赛期间,所有计算都将在覆盆子 Pi4 运行ning linux 上进行 运行。 我想知道哪个代码 运行 最快,这样我就可以知道提交哪个函数。

所以我写了一个名为“lol”的小程序来尝试建立一个已知时间的基线。

//lol....lol is an exe which calls usleep()
#include <unistd.h>
using namespace std;
int main(){
    usleep(100);
    return 0;
}

然后为了测量执行时间,我这样写:

#include <chrono>
#include <stdlib.h>
#include <iostream>
using namespace std::chrono;
using namespace std;
int main(int argc, char **argv){
    //returns runtime in nanoseconds
    //useage: runtime <program>
    //caveates: I put the exe in /home/$USER/bin
    //start timing
    auto start = high_resolution_clock::now();
    //executable being  timed:
    system(argv[1]);
    // After function call
    auto stop = high_resolution_clock::now();
    auto duration = duration_cast<nanoseconds>(stop - start);
    cout << argv[1] << " " << duration.count() << endl;
    return 0;
    }

我的问题是 运行 时间似乎变化很大。这是因为我在用户空间 运行ning 而我的系统也在做其他事情吗?为什么我没有变得更稳定 运行 次?

$ ./run_time lol
lol 13497886
$ ./run_time lol
lol 11175649
$ ./run_time lol
lol 3340143
./run_time lol
lol 3364727
$ ./run_time lol
lol 3372376
$ ./run_time lol
lol 1981566
$ ./run_time lol
lol 3385961
  1. 不是执行程序,而是测量单个程序中的功能完成情况:
    
    auto start = high_resolution_clock::now();
    //function being  timed:
    my_func();
    // After function call
    auto stop = high_resolution_clock::now();
    

您正在使用 chrono header。那么为什么 usleep 当你可以使用 sleep_for 时: https://en.cppreference.com/w/cpp/thread/sleep_for

这场比赛的功劳不在于你micro-optimize如何拯救1ns。这是关于选择正确的算法来计算圆周率。