简易的计时函数
template <typename F>
void timed_execute(std::string_view tag, F &&f) {
auto start = std::chrono::steady_clock::now();
f();
auto end = std::chrono::steady_clock::now();
auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
std::printf("%-20s: ", tag.data());
if (ns >= 1e6) {
std::printf("%.1fms\n", ns / 1e6);
} else if (ns >= 1e3) {
std::printf("%.1fus\n", ns / 1e3);
} else {
std::printf("%zdns\n", ns);
}
}
用法:
timed_execute("reduce", [&] {
auto result = reduce(v.begin(), v.end(), 0);
});
2024 年 10 月 2 日:其实 duration 的 count()
不一定非得是整数。参考 https://en.cppreference.com/w/cpp/chrono/duration ,可以自己定义数据类型为浮点数的 ratio(通用单位,在 std::chrono
中自然就表示时间单位,比如 std::milli
表示 1e-3 这个比例,而 std::chrono::milliseconds
真正表示毫秒这个时间段)。例子:
#include <chrono>
#include <iostream>
using namespace std::chrono_literals;
int main()
{
using Minute = std::chrono::duration<double, std::ratio<60, 1>>;
std::cout << std::chrono::duration_cast<Minute>(1s).count()
<< " minutes\n";
}
// 0.0166667 minutes