微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

chrono 在同一功能下给出不同的度量

如何解决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 举报,一经查实,本站将立刻删除。