我正在尝试测量执行时间。我使用的是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
。保证它是单调的并且具有足够低的分辨率以使其有用。