如何解决chrono 在同一功能下给出不同的度量
我正在尝试测量执行时间。 我在 Windows 10 上使用 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 被节流的情况?您是否要考虑访问位于主板上的主时钟的时间(就计算而言非常远)。
因此,在实践中时间会受到很多因素的影响,测量它的简单事实会减慢一切。不要期望纳秒精度。微信,也许吧。米利斯,当然。
因此,这会让您处于任何测量值都会波动很大的位置。明智的方法是在多次测量中取平均值。或者,更好的是,对不同的数据执行相同的操作一千(百万?)次,然后将结果除以一千。
然后,您将在准确性方面获得显着提高。
在代码中:
start_t = chrono::system_clock::now();
for(int i = 0; i < 1000000; i++)
tree->insert();
end_t = chrono::system_clock::now();
,
您使用了错误的时钟。由于分辨率低且具有非单调性,system_clock
对时间间隔没有用。
改用 steady_clock
。它保证是单调的,并且具有足够低的分辨率以供使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。