And*_*zos 2 c++ c++-chrono c++17
以下程序:
#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;
}
Run Code Online (Sandbox Code Playgroud)
在以下位置打印大约 250 到 300 范围内的数字:
g++ (Ubuntu 8.2.0-7ubuntu1) 8.2.0
Run Code Online (Sandbox Code Playgroud)
和:
Linux 4.18.0-15-generic #16-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
意味着 std::chrono::system_clock 在该系统上是纳秒精度(很可能是 gettimeofday 对吗?)。我有几个问题:
std::chrono::system_clock这个系统上和之间有什么区别std::chrono::steady_clock?(是的,我知道它们在标准中的指定不同,我正在考虑这个实现。)
所有 libstdc++ 目标的答案都相同吗?
所有 libc++ 目标的答案都相同吗?
Windows/MSVC 目标上的答案是否相同?
我不确定您是否在问您想要回答的问题。我看到的一件事是您询问稳定时钟和系统时钟在精度方面的差异。第二个,仅从代码片段来看,是关于 system_clock::now、duration_cast、vector::push_back/vector::insert 和(隐式)vector::resize 的性能。
如果您不介意的话,我将尝试回答这两个问题中的第一个问题:
因此,询问任何特定的实现并希望它们的常量也将用于其他实现(即使对于同一供应商)是不可取的。我总是尝试使用时钟的::时间点或其::持续时间,或者作为最后的手段,使用毫秒或纳秒,具体取决于我测量的内容以及测量的物体的飞行速度。
另请注意,存在 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";
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:哦,另一件事是原始代码中没有任何内容可以证明您的库使用 nano 作为 system_clock 中的周期。您正在执行uration_cast<nanoseconds>(如果必须,则使用整数除法)并从中获取周期,但是具有不同的持续时间,例如duration_cast<duration<long long, pico>>,您也可以在下面的某处获得非零值最低的 1000。不太可能,但也有可能。
编辑2:天哪,这很复杂。更改了第一个要点中 system_clock 不稳定的原因。
| 归档时间: |
|
| 查看次数: |
4554 次 |
| 最近记录: |