基准测试:我什么时候可以停止测量?

时间:2009-09-07 16:15:05

标签: language-agnostic statistics benchmarking

我有一系列功能,都是为了做同样的事情而设计的。相同的输入产生相同的输出,但执行它们所需的时间因功能而异。我想确定哪一个是“最快的”,我想确信我的测量结果是“具有统计意义”。

阅读维基百科和互联网告诉我,统计显着性意味着一个测量或一组测量与零假设的p值阈值不同。这将如何适用?函数A比函数B快的假设是什么?

一旦我确定了整个设置,我该如何确定何时停止测量?我通常会看到基准测试运行三次,然后报告平均值;为什么三次而不是五次或七次?根据{{​​3}}(我自己承认我并不完全理解),费舍尔使用8作为他需要以98%的置信度测量某些东西的样本数量;为什么8?

5 个答案:

答案 0 :(得分:4)

我不打算将统计原则应用于基准测试结果。一般而言,术语“统计显着性”是指您的结果意外实现的可能性,并不代表对真实值的准确评估。在统计中,作为简单概率的结果,随着测量次数的增加,偶然实现结果的可能性降低。在计算机代码的基准测试中,增加试验次数(统计中的“n”)是一件小事,因此意外结果的可能性低于您需要定义的任意阈值(“alpha”或级别)具有统计意义)。

通过大量运行代码来简化:基准测试,并且不用担心统计测量

注意这个答案的潜在选民:这个答案在某种程度上是对问题的简化,旨在以易懂的方式说明概念。像“你显然不了解统计数据”这样的评论会导致野蛮的打败。记得保持礼貌。

答案 1 :(得分:4)

你问两个问题:

  1. 如何进行统计显着性检验,表明函数的平均时间A大于函数的平均时间B
  2. 如果您对答案有一定的信心,您应该选择多少样品?
  3. 第一个问题最常见的答案是,您要么计算confidence interval,要么执行t-test。它与任何其他随机变异的科学实验没有什么不同。要计算函数A的平均响应时间的95%置信区间,只需取平均值并将标准误差的1.96倍加到任一侧。标准误差是方差的平方根除以N.即

    95% CI = mean +/- 1.96 * sqrt(sigma2/N))
    

    其中sigma2是函数A的速度方差,而N是用于计算均值和方差的运行次数。

    你的第二个问题涉及统计power analysis和实验设计。您将描述一个顺序设置,询问是否继续采样。顺序实验的设计实际上在统计学中是一个非常棘手的问题,因为通常不允许计算置信区间或p值,然后在未达到所需重要性的条件下绘制其他样本。如果您希望这样做,那么设置贝叶斯模型并计算速度A大于速度B的后验概率会更明智。然而,这是大规模的过度杀伤。

    在计算环境中,实现非常小的置信区间通常都是微不足道的,因为绘制大N很容易并且因为方差通常很小 - 一个函数显然胜出。

    鉴于维基百科和大多数在线资源在统计方面仍然很糟糕,我建议购买Introductory Statistics with R。您将学习统计数据和应用所学知识的工具。

答案 2 :(得分:1)

你真的关心统计意义还是普通的旧意义?最终,你可能不得不对可读性和性能做出判断 - 统计意义并不能真正帮助你。

我使用了几条经验法则:

  • 在可能的情况下,测试足够的时间让你自信一点点(就像其他事情在短时间内打断你的测试一样)不会产生太大的影响。通常我认为30秒就足够了,虽然这取决于你的应用程序。您测试的时间越长,测试就越可靠 - 但显然您的结果会延迟:)

  • 多次运行测试可以有用,但如果你的计时时间足够长,那么IMO就不那么重要了。它可以缓解其他形式的错误,这使得整个测试花费的时间超过了它应该的时间。如果测试结果看起来很可疑,那么肯定再次运行它。如果您看到不同运行的结果显着不同,请再运行几次并尝试发现模式。

答案 3 :(得分:1)

您的网站研究听起来更像是一个高度控制的环境。这纯粹是一个实用的答案,已经证明自己一次又一次地对性能测试有效。

如果您在现代,多任务,多核,计算环境中对代码进行基准测试,那么实现有用基准测试所需的迭代次数会随着测量操作的时间长度而下降。 / p>

因此,如果您的操作需要约5秒钟,通常需要10到20次迭代。只要迭代间的偏差保持相当稳定,那么您的数据就足以得出结论。你经常会想要抛弃第一次或第二次迭代,因为系统通常会使缓存变热等等......

如果您正在测试毫秒范围内的某些内容,那么您将需要数万次迭代。这将消除由其他过程等引起的噪音。

一旦达到亚毫秒范围 - 10纳秒 - 你就需要数百万次迭代。

不完全科学,但在现代计算系统上都没有“在现实世界中”进行测试。

比较结果时,请将执行速度的差异视为百分比,而不是绝对值。任何低于约5%差异的东西都非常接近噪音。

答案 4 :(得分:0)

你要回答的根本问题是,你所观察到的事情可能偶然发生了吗?这个硬币公平吗?扔一次:HEADS。不,这总是令人失望是不公平的。结论不好!扔了10次并得到7个头,现在你得出什么结论? 1000次和700个头?

对于简单的情况,我们可以想象如何确定何时停止测试。但是你的情况略有不同 - 你真的在进行统计分析吗?

您对测试有多少控制?重复它们会添加任何值吗?您的计算机是确定性的(可能)。 Eistein对精神错乱的定义是重复一些事情并期待不同的结果。那么当你运行测试时,你会得到可重复的答案吗?如果你做的测试足够好,我不确定统计分析是否有帮助。

对于你正在做的事情,我会说第一个关键是要确保你真的在衡量你的想法。运行每个测试足够长的时间以隐藏任何启动或关闭效果。由于这个原因,有用的性能测试往往会运行很长时间。确保您实际上没有在测试工具中测量时间而不是代码中的时间。

您有两个主要变量:在一次测试中运行多少次迭代?要运行多少个测试?

维基百科说这个

  

除了表达   人口的变异性,标准   偏差通常用于衡量   对统计结论的信心。   例如,误差范围   轮询数据由确定   计算预期标准   如果结果偏差相同   民意调查是多次进行的   倍。报告的误差范围是   通常约为标准的两倍   偏差。

因此,如果您的目标是确保一个函数比另一个函数更快,则可以对每个函数运行多个测试,计算均值和标准差。我的期望是,如果任何一个测试中的迭代次数都很高,那么标准偏差就会很低。

如果我们接受错误边界的定义,你可以看出这两种方法是否比它们的总误差范围更远。