-1

我正在尝试测量执行时间。我在 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() 函数插入工作的时间,如跟随(只是伪代码)

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

我不知道为什么会出现这个结果并想知道。

4

2 回答 2

2

您要衡量的内容定义不明确。

“这段代码运行了多长时间”看起来很简单。但是,实际上,您的意思是“我的代码占用了多少 CPU 周期”?或者我的程序和其他正在运行的程序之间有多少个周期?您是否考虑了在 CPU 上加载/卸载它的时间?您是否考虑到使用电池时 CPU 会被节流?您是否要考虑访问位于主板上的主时钟的时间(就计算而言非常远)。

所以,在实践中,时间会受到很多因素的影响,测量它的简单事实会减慢一切。不要指望纳秒精度。微博,也许吧。米利斯,当然。

因此,这使您处于任何测量都会波动很大的位置。明智的方法是在多次测量中对其进行平均。或者,更好的是,将相同的操作(在不同的数据上)一千(百万?)次,然后将结果除以一千。

然后,您将在准确性上获得显着提高。

在代码中:

start_t = chrono::system_clock::now();
for(int i = 0; i < 1000000; i++)
tree->insert();
end_t = chrono::system_clock::now();
于 2021-05-19T17:31:01.433 回答
0

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

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

于 2021-05-19T17:13:34.387 回答