【IT168 技术】本文曾获得OOPSLA十年最具影响力论文奖。我们看到许多论文都包含某种性能评估。正如Georges等人所说,如果没有良好的实验设计和严谨的统计数据,很难得出确凿的结论,有时甚至还可能获得错误的结论,本文是在Java性能评估的背景下完成的。
基准测试是实验计算机科学研究和开发的核心。因此,拥有严格的基准测试方法是至关重要的。一个不严谨的方法可能会扭曲整体情况,甚至导致错误的结论,推动研究和开发向非生产性方向发展,或者导致一个非非常受欢迎的产品/产品较受欢迎投放市场。
一个好的基准需要一个精心挑选,充满动力的实验设计。除此之外,它需要一个完善的绩效评估方法。
绩效评估方法需要充分处理实验环境中的非确定性问题。而处理非确定性的常用数据分析方法在统计上往往都不够严格。
在Java的上下文中,非确定性的来源包括JIT编译,线程调度和垃圾收集等。对于在云平台上运行的许多基准测试来说,底层云平台中的非确定性也是一个重要因素。
性能评估问题
通常在发布时进行评估是一种方法,这种方法可以完成一些性能运行(,并报告非常好的性能数值(最小执行时间)。例如,下图是五个不同的垃圾收集器的性能对比。
CopyMS和GenCopy表现差不多,而SemiSpace明显优于GenCopy。
以下是相同的实验结果,但报告使用了95%置信区间,统计学上更严格的报告方法。
现在我们看到,GenCopy明显优于CopyMS,而SemiSpace和GenCopy具有重叠置信区间,它们之间的差异可能仅仅是由于被测系统中的随机性能变化。
在调查了50篇Java性能文章之后,作者表示对于Java性能评估使用的方法论没有统一的意见,下表中总结了这些论文中使用的一些方法:
误导结果的例子
假设你使用非严格的方法,需要从一组运行中得出单个数字,例如非常好的,平均,最差等。在成对比较中,如果两个系统之间的增量大于某个阈值,则可能会有一个有意义的性能差异θ。如果使用统计学上严谨的方法学和置信区间报告,可能会看到:
·重叠的间隔
·非重叠的间隔,与非严格的方法相同
·非重叠的间隔,与非严谨的方法不同
这会导致六种不同的情况,其中只有一种情况,你可以依靠非严谨方法的结果:
作者进行了一系列的测试,发现所有流行的方法都可能导致误导,其中大部分替代方法的比较高达16%。即使在3%的比较中也会出现错误的结论。(如果你真的必须得到单一的数字,平均值和中位数会是更好的选择)。
统计
我们主张增加统计的严格性来管理运行时系统,尤其是Java系统的性能评估研究。统计学上严格数据分析的动机是统计学,特别是置信区间,使人们能够确定在测量中观察到的差异是否是由于测量中的随机波动或者由于替代方式中的实际差异相互比较而造成的。
原文中的这一部分基本上是为测试人员量身定做的迷你统计教程。如果我们能够从每次的实验中得到确切可重复的数字,那么一切就变得简单了。但事实并非这样,非确定性的存在,使得我们不得不控制实验与测量内容无关的骚扰事件。第一步就是舍弃极端的异常值,然后计算一个置信区间。
在每个实验中,样本是从潜在人口中抽取的。从这些样本得出均值的置信区间,然后量化具有包括实际总体均值给定概率值的范围。
定义一个置信区间 【C1,C2】,使得μ介于C1和C2之间的概率1-α,其中α是显着性水平,(1-α)是置信水平。
90%置信区间意味着90%的可能性是潜在人口的实际分布均值处于置信区间内。对于同样的数据,如果我们想要更确信真实的均值位于区间内,比如说95%的置信区间,那么随之而来的是我们需要使区间更宽。
比较替代品
到目前为止,我们知道如何计算单个系统均值的置信区间。如果我们比较两个系统和它们的置信区间重叠,那么我们就不能得出这样的结论:在平均值中所看到的差异不是由于测量中的随机波动造成的。如果置信区间不重叠,我们就得出结论,没有证据表明差异有统计学意义。
本文给出了两种方法差分计算置信区间的计算公式(见第3.3节)。如果这个区间包含0,我们可以在所选的置信水平上得出结论,两者之间没有统计上的显著差异。
如果我们想要比较两个以上的替代方案,那么我们就可以使用一个叫做方差分析的技术(ANOVO)。
方差分析将一组测量中的总变化分为由于测量中的随机波动而导致的分量和由于替代方式之间的实际差异导致的分量...如果替代之间的变化大于每个替代中的变化,可以得出结论,在替代方案之间存在统计上显着的差异。
ANOVO测试并没有告诉你哪一种选择有统计学差异,如果有的话,可以使用Tukey HSD(非常不同的)测试。
在方差分析中,我们可以在一个实验中改变一个输入变量。多因素方差分析使你能够研究多个输入变量及其相互作用的影响。ANOVA(MANOVA)使你能够在多个基准测试中得出结论。
建议
使用更复杂的分析,如多因素方差分析和MANOVA,通常会有两个问题。首先,他们的产出通常是不直观的,而且在许多情况下,没有深入的统计背景,很难理解。第二,正如前面所提到的,在分析过程中所需要做的所有度量都非常耗时,以致于它变得难以处理。
因此,本文第4节介绍了一套实用但仍有统计学意义的Java性能评估建议。