Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何计算标准偏差,四分位数。。。对代码进行基准测试?_C++_C_Performance_Benchmarking - Fatal编程技术网

C++ 如何计算标准偏差,四分位数。。。对代码进行基准测试?

C++ 如何计算标准偏差,四分位数。。。对代码进行基准测试?,c++,c,performance,benchmarking,C++,C,Performance,Benchmarking,我编写了一些函数来对函数/代码进行基准测试。我是这样做的: start = timer for(1 second) call fun iterations++ stop = timer 然后我有一个平均时间:停止-开始/迭代,对吗 单个调用太“短”而无法测量,因此我如何从这种类型的测量、标准偏差、四分位数等进行计算 标准差和四分位数都处理组中值的分布 只有一次测量,这些就变得微不足道或毫无意义。因为只有一个测量值,这个值就是平均值、最小值、最大值和模式。由于所有测量值均不偏离平均值

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

start = timer
for(1 second)
   call fun
   iterations++
stop = timer
然后我有一个平均时间:停止-开始/迭代,对吗


单个调用太“短”而无法测量,因此我如何从这种类型的测量、标准偏差、四分位数等进行计算

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


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

您必须找到一种足够精确地测量时间的方法。为了得到任何有意义的标准差等,你需要时间来进行个人的娱乐通话


可能包含有用的提示,我相信也有很多特定于平台的高分辨率计时器。

一般来说,由于处理速度和获取微秒和毫秒分辨率的困难,大多数性能测量都基于大量迭代

例如:

读取开始时间 对于1000000次迭代 履行职能 结束 读取结束时间。 持续时间是结束时间-开始时间。 平均执行时间是持续时间除以迭代次数

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


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

如果一个电话太短而无法测量,那么你为什么要关心它需要多长时间

我有点开玩笑,但是如果你在英特尔Linux上,并且你的进程固定在一个内核上,你可以读取CPU的时间戳计数器TSC,这是你能得到的最高分辨率。在最近的Intel CPU中,它在名义CPU频率上非常稳定,与实际频率无关,实际频率变化很大。如果你在谷歌上搜索rdtsc,你会发现rdtsc函数的几个实现,你可以直接调用。然后,您可以尝试以下方法:

uint64_t tic, elapsed[10000];

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

这可能会使您在单个函数调用的可能有点/排序半有效值的范围内,然后您可以从中生成所需的任何统计信息mean/mode/median/variance/std.dev。。这个方法的有效性是值得商榷的,但这是最好的方法。我更倾向于在perf-record下运行整个应用程序,然后使用perf-report来查看循环在何处花费,并将重点放在这一点上。

你不能。afaik没有任何有意义的方法来定义一次测量的标准偏差或百分位数。要进行std dev等,在您的通话中,您必须测量每次通话的时间,您指出该时间太短,无法真正测量。然后你会有一个时间测量的集合来分析。唯一的替代方法是多次运行1秒循环,并对所有测量的平均值执行std dev等操作。但这不清楚是否很有意义。@Carsten:那么我该怎么做?我该怎么做才能得到这个统计值?有没有精确计时的想法?更新了我的答案,但我自己最近没有做过任何高分辨率计时。例如,我不确定windows上的高分辨率时钟的状态,也许现在已经改善了?不,看起来不是这样-boost chrono可能仍然是更好的方式。谢谢!我使用GeTrices和CcLogyGETTIME,但它们仍然不精确,我假设C++是由于你的问题中的标签。所以我认为你是在Linux上工作。Boost是开源的,因此您可以查看它们的代码,但由于有大量的平台/编译器ifdef,因此通常不太容易阅读。你必须研究一下如何在C语言中进行精确计时,也许可以问一个新问题,并设置适当的标记-但只有在你自己尝试了一点之后;