chrono在相同的函数中给出不同的度量



我正在尝试测量执行时间。我使用的是windows10,使用的是gcc编译器。

start_t = chrono::system_clock::now();
tree->insert();
end_t = chrono::system_clock::now();
rslt_period = chrono::duration_cast<chrono::nanoseconds>(end_t - start_t);

这是我测量bp_w->insert()时间的代码函数插入的内部工作方式类似于follow(只是伪代码(

insert(){
_load_node(node);
// do something //
_save_node(node, addr);
}
_save_node(n){
ofstream file(name);
file.write(n);
file.close();
}
_load_node(n, addr){
ifstream file(name);
file.read_from(n, addr);
file.close();
}

实际结果是,read是_load_node执行的次数。write是_save_node执行的次数。时间是纳秒。

read  write time
1     1     1000000
1     1     0
2     1     0
1     1     0
1     1     0
1     1     0
2     1     0
1     1     1004000
1     1     1005000
1     1     0
1     1     0
1     1     15621000

我不知道为什么会有这样的结果,我想知道。

您试图测量的内容定义不清。

"这个代码运行"需要多长时间;看起来很简单。然而,在实践中,你的意思是";我的代码占用了多少CPU周期?或者我的程序和其他正在运行的程序之间有多少个周期?你考虑了在CPU上加载/卸载它的时间吗?你认为CPU在使用电池时会被抑制吗?你想计算访问主板上主时钟的时间吗(就计算而言,这是非常遥远的(。

因此,在实践中,时间会受到很多因素的影响,而测量它的简单事实会减缓一切。不要指望精确到纳秒。也许是Micros。当然是米莉斯。

所以,这会让你处于一个任何测量都会有很大波动的位置。明智的方法是通过多次测量将其平均化。或者,更好的是,(对不同的数据(做一千次相同的运算,然后将结果除以一千。

然后,你会在准确性上得到显著提高。

代码中:

start_t = chrono::system_clock::now();
for(int i = 0; i < 1000000; i++)
tree->insert();
end_t = chrono::system_clock::now();

您使用了错误的时钟。由于低分辨率及其非单调性,CCD_ 4对定时间隔没有用处。

请改用steady_clock。保证它是单调的并且具有足够低的分辨率以使其有用。

最新更新