代码之家  ›  专栏  ›  技术社区  ›  Bailey Parker

使用std::chrono::staid_clock对线程/异步中的代码进行基准测试

  •  1
  • Bailey Parker  · 技术社区  · 7 年前

    #include <chrono>
    #include <future>
    #include <iostream>
    #include <vector>
    
    
    using unit_t = std::chrono::nanoseconds;
    
    unit_t::rep expensive_computation() {
        auto start = std::chrono::steady_clock::now();
        // Something time-consuming here...
        auto end = std::chrono::steady_clock::now();
    
        auto duration = std::chrono::duration_cast<unit_t>(end - start).count();
    
        return duration;
    }
    
    int main() {
        std::vector<std::future<unit_t::rep>> computations;
    
        for (int i = 0; i < 100; i++) {
            computations.push_back(std::async(expensive_computation));
        }
    
        for (size_t i = 0; i < computations.size(); i++) {
            auto duration = computations[i].get();
            std::cout << "#" << i << " took " << duration << "ns" << std::endl;
        }
    }
    

    我担心自从 steady_clock is montonic across threads 全部的 线程)。这意味着如果一根线在睡觉, 稳定时钟 duration 为了那根线。我的怀疑是对的吗?或者 稳定时钟

    换句话说,这种方法是否是一种安全的方法,可以独立地对大量计算进行计时(这样,在一个线程上花费的CPU时间不会影响 期间 另一根线的?或者,我是否需要为每个计算剥离单独的过程,以使 稳定时钟 只在计算运行/计划时打勾?

    我还认识到,在这个问题上,旋转比核心更多的线程可能是一种低效的方法(尽管,我并不特别关心计算吞吐量;而且,我只是希望它们作为一个组在最快的时间内完成)。我怀疑在实践中,我需要维护一个运行中的线程的小的常量有界列表(比如以核心数量为上限),并且只在核心可用时才开始新的计算。但是,这不应该对我上面关心的计时产生影响;它应该只会影响墙上的时钟时间。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Howard Hinnant    7 年前

    标准规定 steady_clock 模型 身体的 时间(与CPU时间相反)。

    类对象 稳定时钟 表示时钟,其时间点的值不会随着物理时间的推移而减少,并且 time_point

    有多好 实现模型物理时间是一个QOI问题。不过,你的代码在我看来很好。

    <chrono> 也可以创建自己的自定义时钟,该时钟在 <chrono> 图书馆。

        2
  •  2
  •   Geezer    7 年前

    这意味着如果一根线在睡觉,稳定的时钟会 仍在等待,这一次将不正确地包括在 该线程的持续时间。

    不正确 std::chrono::steady_clock 身体的 时间,不是CPU时间或任何其他时间。看下面 [time.clock.steady]

    steady_­clock 表示值为 time_­point 从不减少为 身体的 时间的推移 时间点 相对于 实时。。。