简易的计时函数

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