0 - 三角洲
使用 delta 函数计算时间差:
auto start = std::chrono::steady_clock::now();
std::cout << "Elapsed(ms)=" << since(start).count() << std::endl;
since
接受任何时间点并产生任何持续时间(毫秒是默认值)。它被定义为:
template <
class result_t = std::chrono::milliseconds,
class clock_t = std::chrono::steady_clock,
class duration_t = std::chrono::milliseconds
>
auto since(std::chrono::time_point<clock_t, duration_t> const& start)
{
return std::chrono::duration_cast<result_t>(clock_t::now() - start);
}
Demo
1 - 定时器
使用基于以下的计时器std::chrono
:
Timer clock; // Timer<milliseconds, steady_clock>
clock.tick();
/* code you want to measure */
clock.tock();
cout << "Run time = " << clock.duration().count() << " ms\n";
Demo
Timer
定义为:
template <class DT = std::chrono::milliseconds,
class ClockT = std::chrono::steady_clock>
class Timer
{
using timep_t = typename ClockT::time_point;
timep_t _start = ClockT::now(), _end = {};
public:
void tick() {
_end = timep_t{};
_start = ClockT::now();
}
void tock() { _end = ClockT::now(); }
template <class T = DT>
auto duration() const {
gsl_Expects(_end != timep_t{} && "toc before reporting");
return std::chrono::duration_cast<T>(_end - _start);
}
};
正如Howard Hinnant所指出的,我们使用持续时间来保留在chrono
类型系统中并执行诸如平均或比较之类的操作(例如,这里这意味着使用std::chrono::milliseconds
)。当我们只做 IO 时,我们使用count()
持续时间的或滴答声(例如这里的毫秒数)。
2 - 仪表
任何可调用(函数、函数对象、lambda 等)都可以用于基准测试。假设您有一个F
可使用 arguments 调用的函数arg1,arg2
,这种技术会导致:
cout << "F runtime=" << measure<>::duration(F, arg1, arg2).count() << "ms";
Demo
measure
定义为:
template <class TimeT = std::chrono::milliseconds
class ClockT = std::chrono::steady_clock>
struct measure
{
template<class F, class ...Args>
static auto duration(F&& func, Args&&... args)
{
auto start = ClockT::now();
std::invoke(std::forward<F>(func), std::forward<Args>(args)...);
return std::chrono::duration_cast<TimeT>(ClockT::now()-start);
}
};
如 (1) 中所述,使用无持续时间.count()
对于希望在 I/O 之前对一堆持续时间进行后处理的客户端最有用,例如平均:
auto avg = (measure<>::duration(func) + measure<>::duration(func)) / 2;
std::cout << "Average run time " << avg.count() << " ms\n";
+这就是转发函数调用的原因。
+完整的代码可以在这里找到
+我尝试建立一个基于chrono的基准测试框架记录在这里
+旧演示