茱莉亚•埃文斯

基准测试正确是很困难的(和技术做得更好)

这篇文章是关于纸严格在合理的时间基准

几个月前朱利安告诉我的一篇论文印刷浮点数:一个更快,总是正确的方法。真的有两个对我而言很不平常的事情。

第一:我不知道印刷浮点数是一个研究的问题!核心问题是——有一个有限的64位浮点数(2 ^ 64人!)。对于任意数量,有一个或两个最近的浮点数。0.21和0.21000000000000002是非常接近!如此之近,他们之间没有浮点数。你可以看到这在Python中:

> > >打印0.210.21 > > >打印0.210000000000000020.21

这不是一个错误在Python的一部分;这仅仅是浮点数是如何工作的。这意味着印刷一个浮点数原则上是重要的——它不是错误的呈现0.21作为0.21000000000000002,但可能你想打印的最短的版本号码。本文讨论如何这样做正确。我爱学习编程问题正在解决我的电脑每一天,当序列化数据到JSON !),我甚至不知道存在。

第二个有趣的摘要是——最初的结果说,他们有一个算法打印的浮点数

  • 总是正确的(尽可能短)
  • 跑2 x的速度比最快的(近似)算法

这被证明是错误的——它实际上是2 x比近似算法(它仍然是一个改善艺术具体算法)的状态。他们谈论发生了什么他们的自述

我不指出这一点开玩笑的研究人员想出了一个不正确的结果。我敢肯定他们比我更好的性能分析方法。相反,我认为这是一个很好的例证,基准测试程序,找出哪一个是速度是很困难的——或许比你想象的难很多。

严格在合理的时间基准

好吧,现在这篇文章的实际点。朱利安那天还递给我一张纸严格在合理的时间基准

在这,他们开始说

  • 许多性能结果小的改进(5 - 10%),他们调查了,改进广告中值为10%
  • 提高了10%是错误的范围内大量的实验
  • 所以你需要置信区间在你的标准!!
  • 但超过一半的论文讨论性能不发布置信区间

我更感兴趣的问题学术严谨和标杆管理在实践中正确的想法更感兴趣——我想让程序更快,和一个很好的方法让你的东西更快的方式是使许多小5%的改进。所以你需要能够检测提高了5%。

独立

第一个想法他们谈论,这对我来说是新鲜的,就是如果你运行一个基准测试很多次,重要的是是否运行时收敛于一个序列的iid样本。这是数学,这里有一些图片说明我认为它的意思是:

在第一个,起初一切都慢。也许在Java代码,和JIT没踢。但后来我们加快样品,一切稳定,和你的黄金。之后你可能有意义地平均点(但是记住扔掉开始的样品!!)。

在第二个例子中,有这个奇怪的周期模式:程序是缓慢的,那么快,然后缓慢。你可能会觉得这是不可能的,但在报纸上他们谈两个基准他们每次都是跑——一个快跑(200次迭代),每次都是和一个慢。他们跑。

他们说这不是世界末日,如果你有第二个例子这样的情况——它发生!但是你需要注意的。他们已经为做什么具体建议在所有这些情况下(看报纸发现他们!)

我发现这很有趣,因为图形基准的速度随着时间的推移,当然是做一些我从未做过的事情(通常我只是盲目地采取平均之类的)。现在我更有动力去做。

技术检查独立性:随机洗牌

有很多技术计算出如果一群样本是独立的。你可以计算一些相关数字和做数学的东西。但是!我真的很喜欢统计冒烟测试,你可以看一些视觉和说“哦,不,那是肯定了”。他们给了一个非常好的冒烟测试。

我们的想法是随着时间的推移——如果你有一系列的基准(如周期上面我画),然后随机洗牌的基准,基本上随机打乱一个看起来和原来的一样吗?如果不是(像如果原始monotically减少一个,重组一个没有),那就不是独立!!

基准测试是困难的。理解你的数据是好的。

我知道对于Java有一个基准测试框架JMH也认为,解决一些常见的基准问题。我发现这篇文章很有趣,因为它不提倡使用一个聪明的基准测试框架为你解决所有的问题,而不是解释了如何理解你的代码的性能基准测试和设计适当的统计分析。我不知道哪个更好!!

但是当一个人做了很多的数据分析,你应该看看你使用的数据做出一个重要决定(不仅仅是计算值/平均值)的单点估计在我看来非常合理。

感谢朱利安Squires论文。

如何HTTP请求发送到正确的位置吗?吗? 一些草图