以下程序:
#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
在此系统上有什么区别? (是的,我知道标准中对它们的指定有所不同,我正在考虑这种实现。)
所有libstdc ++目标的答案是否相同?
所有libc ++目标的答案是否相同?
在Windows / MSVC目标上答案是否相同?
答案 0 :(得分:3)
我不确定您是在问要回答的问题。我看到的一件事是,您询问的是稳定时钟和系统时钟之间的差异,即它们的精度。第二个,仅从代码片段来看,是关于system_clock :: now,duration_cast,vector :: push_back / vector :: insert和(隐式)vector :: resize的性能。
如果您不介意,我将尝试回答这两个问题中的第一个:
因此,不建议询问任何特定的实现,并希望它们的常量也将用于其他实现中,即使对于同一供应商也是如此。我总是尝试使用clock's :: 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
编辑2:,此很复杂。更改了第一个项目符号中system_clock不稳定的原因。