以下程序:
#include <chrono>
#include <iostream>
#include <vector>
inline uint64_t now() {
return std::chrono::duration_cast
<std::chrono::nanoseconds>
(std::chrono::system_clock::now()
.time_since_epoch())
.count();
}
int main() {
std::vector<uint64_t> v;
for (int i = 0; i < 1000; i++)
v.push_back(now());
for (int i = 0; i < v.size()-1; i++)
std::cout << v[i+1] - v[i] << std::endl;
}
打印数量在250到300左右的范围内:
g++ (Ubuntu 8.2.0-7ubuntu1) 8.2.0
有:
Linux 4.18.0-15-generic #16-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
意思是std :: chrono :: system_clock在这个系统上是纳秒精度(很可能是gettimeofday对吗?)。我有几个问题:
std::chrono::system_clock
和std::chrono::steady_clock
之间的区别是什么? (是的,我知道它们在标准中有不同的指定,我正在考虑这个实现。)我不确定你是否在问你想要回答的问题。我看到的一件事是你在稳定性和系统时钟方面的问题,就其精度而言。第二,从单独的片段判断,是关于system_clock :: now,duration_cast,vector :: push_back / vector :: insert和(implicit)vector :: resize的性能。
如果你不介意,我会尝试回答这两个中的第一个:
因此,询问任何特定的实现并希望它们的常量也将用于其他实现 - 即使对于同一个供应商 - 也是不可取的。我总是尝试使用clock的:: time_point,或者:: duration,或者作为最后的手段,毫秒或纳秒,这取决于我测量什么以及测量的东西飞得多快。
还请注意有system_clock ::(to / from)_time_t()函数,即使system_clock :: duration具有更精细的周期,它肯定会产生1超过1的值(秒)。
使用steady_clock,其time_point和尽可能晚地调用duration_cast的修订片段将是:
#include <chrono>
#include <iostream>
#include <vector>
int main() {
using namespace std::chrono;
using clock = steady_clock;
std::vector<clock::time_point> v;
for (int i = 0; i < 1000; i++)
v.push_back(clock::now());
for (size_t i = 0; i < v.size()-1; i++) {
std::cout
<< duration_cast<nanoseconds>(
v[i+1] - v[i]
).count()
<< "ns\n";
}
}
编辑:哦,另一件事是原始代码中没有任何内容可以证明你的库在system_clock中使用nano作为句点。你正在做一个duration_cast <nanoseconds>(如果必须的话,它使用整数除法)并从中获得周期,但持续时间不同,例如duration_cast <duration <long long,pico >>,你也可以在下面的某个地方得到非零值最低的1000.不太可能,但可能永远不会少。
编辑2:Sheesh这很复杂。在第一个项目符号点中更改了system_clock不稳定的原因。