繁体   English   中英

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

[英]Using std::chrono::steady_clock to benchmark code in a thread/async

假设我有很多要在多个线程中运行的计算(以及基准CPU时间)。 作为玩具示例:

#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在各个线程steady_clock是蒙脱的,因此每个进程而不是每个线程的底层时钟滴答声(如果计划了任何线程,则所有线程的时钟滴答声)。 这意味着如果一个线程正在睡眠,则steady_clock仍会为其计时,并且该时间将错误地包含在该线程的duration中。 我的怀疑正确吗? 还是steady_clock仅在线程内的线程CPU时间上打勾?

换句话说,这种方法是独立计时大量计算的安全方法吗(这样一个线程上没有CPU时间会影响另一个线程的duration )? 还是我需要为每个计算剥离单独的进程,以使只有在运行/计划计算时才使steady_clock

编辑:我还认识到,将线程多于内核可能是解决此问题的低效方法(尽管我并不特别在乎计算吞吐量;而且,我只希望它们作为一个整体在最快的时间内完成) 。 我怀疑在实践中,我需要维护一个正在运行的线程的恒定常量列表(例如,限制在内核数量之内),并且只有在内核可用时才开始新的计算。 但是,这不应该影响我上面所关心的时间; 它只影响挂钟时间。

该标准指定了steady_clock模型的物理时间(而不是CPU时间)。

从[time.clock.steady]开始:

steady_clock类的steady_clock表示以下时钟:对于它们的时钟,time_point的值从不随物理时间的增长而减小,并且针对它们的time_point值相对于实时以稳定的速率增长。 即,时钟可能无法调整。

话虽这么说,实现如何很好地模拟物理时间是QOI问题。 不过,您的代码对我来说还不错。

如果您的实验不能令人满意, <chrono>客户端也可以编写自己的自定义时钟,这些时钟在<chrono>库中具有一流的状态。

这意味着如果一个线程正在睡眠,则steady_clock仍会为其计时,并且该时间将错误地包含在该线程的持续时间中。

不过,这并不是错误的 ,正如该标准为类std::chrono::steady_clock指定的std::chrono::steady_clock ,它测量物理时间,而不是CPU时间或任何其他时间。 参见[time.clock.steady]下的内容

steady_clock类的steady_clock表示以下时钟:对于它们的时钟, time_point值永远不会随着物理时间的time_point而减少,并且对于它们的time_point值相对于实时以稳定的速率增长...

就是说,您的代码看起来不错,因为它将为您提供每个线程运行所测量的时间。 您是否有理由在这里测量CPU时间? 如果是这样,请在评论中让我知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM