【问题标题】:How to calculate std dev, quartile, ... with benchmarking a code?如何通过对代码进行基准测试来计算标准偏差、四分位数……?
【发布时间】:2013-08-29 15:01:59
【问题描述】:

我编写了一些函数来对函数/代码段进行基准测试。我是这样做的:

start = timer
for(1 second)
   call fun
   iterations++
stop = timer

然后我有一个平均(平均)时间:(停止-开始/迭代),对吧?

单次调用太“短”而无法测量,那么我如何从这种类型的测量、标准差、四分位数等中计算...?

【问题讨论】:

  • 你不能。没有任何有意义的方法 (afaik) 可以为一次测量定义标准偏差或百分位数。
  • 要在您的通话中进行标准开发等,您必须测量每次通话的时间,您已经指出该时间太短而无法真正测量。然后你会有一组时间测量来分析。唯一的选择是多次运行您的 1 秒循环并在所有测量的平均值上执行 std dev 等。但目前还不清楚这是否有意义。
  • @Carsten:那我怎么做(我应该怎么做)测量才能得到这个统计值?

标签: c++ c performance benchmarking


【解决方案1】:

标准差和四分位数都处理一组值的分布。

只需一次测量,这些就变得微不足道或毫无意义。由于只有一个测量值,因此该值是平均值、最小值、最大值和众数。由于没有任何测量值偏离均值,因此方差和标准差为零。

【讨论】:

    【解决方案2】:

    您必须找到一种足够精确地测量时间的方法。您需要单独调用 fun 的时间,以获得任何有意义的标准偏差等。

    This question 可能包含有用的提示,我敢肯定那里也有很多特定于平台的高分辨率计时器。

    【讨论】:

    • 对精确计时有什么想法吗?
    • 更新了我的答案,但我自己最近没有做任何高分辨率计时。例如,我不确定 Windows 上 <chrono>s high_resolution_clock 的状态,也许现在已经有所改善?
    • 不,看起来不像 - boost chrono 可能仍然是更好的选择。
    • 谢谢!我使用getrusageclock_gettime,但它们仍然不够精确
    • 好吧,由于您问题中的标签,我假设为 C++。所以我认为你正在使用 Linux。 Boost 是开源的,所以你可以看一下他们的代码,但通常不是很容易阅读,因为有很多平台/编译器#ifdefs。您将不得不研究一下如何在 C 中进行精确计时,也许用适当的标签集提出一个新问题 - 但只有在您自己尝试了一点之后;)
    【解决方案3】:

    一般来说,由于处理速度和获得微和毫秒分辨率的麻烦,大多数性能测量都是基于大量的迭代。

    例如:

    1. 读取开始时间
    2. 进行 1,000,000 次迭代
    3. 执行功能
    4. 结束
    5. 读取结束时间。

    持续时间是结束时间 - 开始时间。 平均执行时间是持续时间除以迭代次数。

    使用平均时间还有其他原因:操作系统中断、数据缓存未命中以及可能的外部因素(例如硬盘访问)。

    要进行更精确的测量,您必须使用“测试点”和示波器。在迭代之前将高脉冲写入测试点,然后再写入低脉冲。设置示波器以捕获持续时间。如果您的示波器具有统计功能和存储功能,请将测试点写入移动到功能执行之前和之后。

    【讨论】:

      【解决方案4】:

      如果单个呼叫太短而无法衡量,那么您为什么关心它需要多长时间?

      我有点开玩笑,但如果您使用的是 Intel Linux,并且您的进程被固定到一个内核,您可以读取 CPU 的时间戳计数器 (TSC),这是您可以获得的最高分辨率刻度。在最近的英特尔 CPU 中,它在标称 CPU 频率上非常稳定,与实际频率无关(变化很大)。如果您在 Google 上搜索“rdtsc”,您会发现可以调用的 rdtsc() 函数的几个实现。然后,您可以尝试以下操作:

      uint64_t tic, elapsed[10000];
      
      for(i=0; i<10000; i++) {
          tic = rdtsc()
          my_func()
          elapsed[i] = tic - rdtsc()
      }
      

      这可能会让您在单个函数调用的可能有点/有点半有效值的范围内,然后您可以从中生成您想要的任何统计数据(均值/众数/中值/方差/std.dev。)。这样做的有效性值得商榷,但它是用你的方法可以做到的最好的。我更倾向于在perf record 下运行整个应用程序,然后使用perf report 来查看周期消耗的地方并专注于此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 2014-09-20
        • 1970-01-01
        • 2016-09-14
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多