使用 C++11 的可移植定时代码的正确方法
Correct way of portably timing code using C++11
我正在为具有低延迟要求的程序的一部分编写一些计时代码。
查看 std::chrono 库中可用的内容,我发现编写可移植的计时代码有点困难。
- std::chrono::high_resolution_clock
- std::chrono::steady_clock
- std::chrono::system_clock
system_clock没有用,因为不稳定,剩下的两个时钟有问题。
high_resolution_clock 不一定在所有平台上都稳定。
steady_clock不一定支持细粒度解析时间段(例如:纳秒)
为了我的目的,拥有一个稳定的时钟是最重要的要求,我可以用微秒级的粒度来解决。
我的问题是,如果有人想在不同的 h/w 体系结构和操作系统上为可能 运行 的代码计时 - 最好的选择是什么?
使用steady_clock
。在所有实现中,它的精度都是纳秒。您可以通过打印 steady_clock::period::num
和 steady_clock::period::den
.
自己检查您的平台
现在这并不意味着它会实际测量纳秒精度。但是平台会尽力而为。对我来说,连续两次调用 steady_clock
(启用优化)将报告相隔 100ns 的时间。
#include "chrono_io.h"
#include <chrono>
#include <iostream>
int
main()
{
using namespace std::chrono;
using namespace date;
auto t0 = steady_clock::now();
auto t1 = steady_clock::now();
auto t2 = steady_clock::now();
auto t3 = steady_clock::now();
std::cout << t1-t0 << '\n';
std::cout << t2-t1 << '\n';
std::cout << t3-t2 << '\n';
}
以上示例使用此 free, open-source, header-only library 只是为了方便格式化持续时间。你可以自己格式化(我很懒)。对我来说,这只是输出:
287ns
116ns
75ns
YMMV.
我正在为具有低延迟要求的程序的一部分编写一些计时代码。
查看 std::chrono 库中可用的内容,我发现编写可移植的计时代码有点困难。
- std::chrono::high_resolution_clock
- std::chrono::steady_clock
- std::chrono::system_clock
system_clock没有用,因为不稳定,剩下的两个时钟有问题。
high_resolution_clock 不一定在所有平台上都稳定。
steady_clock不一定支持细粒度解析时间段(例如:纳秒)
为了我的目的,拥有一个稳定的时钟是最重要的要求,我可以用微秒级的粒度来解决。
我的问题是,如果有人想在不同的 h/w 体系结构和操作系统上为可能 运行 的代码计时 - 最好的选择是什么?
使用steady_clock
。在所有实现中,它的精度都是纳秒。您可以通过打印 steady_clock::period::num
和 steady_clock::period::den
.
现在这并不意味着它会实际测量纳秒精度。但是平台会尽力而为。对我来说,连续两次调用 steady_clock
(启用优化)将报告相隔 100ns 的时间。
#include "chrono_io.h"
#include <chrono>
#include <iostream>
int
main()
{
using namespace std::chrono;
using namespace date;
auto t0 = steady_clock::now();
auto t1 = steady_clock::now();
auto t2 = steady_clock::now();
auto t3 = steady_clock::now();
std::cout << t1-t0 << '\n';
std::cout << t2-t1 << '\n';
std::cout << t3-t2 << '\n';
}
以上示例使用此 free, open-source, header-only library 只是为了方便格式化持续时间。你可以自己格式化(我很懒)。对我来说,这只是输出:
287ns
116ns
75ns
YMMV.