天天看点

Java性能优化实践p73

通常情况下,基准测试都需要一些设置,比如创建一个数据集,或者为一组用来比较性能的、正交的基准测试集设置所需的条件。

状态,以及控制状态是JMH框架所具有的另一个特性。可以用@State注解来定义该状态,并接受Scope枚举来定义状态的可见范围:Benchmark,Group还是Thread.

使用@State注解的对象在基准测试的生命周期内都是可达的,它可能还需要执行一些必要的设置。

多线程代码也需要谨慎处理,以确保基准测试不会因为状态管理不善而出现偏差。

一般来说,如果在一个方法中执行的代码没有副作用并且返回结果也没有用到,那JVM就可以考虑移除这个方法,JMH需要防止这种情况的发生,而且事实上,对于基准测试的作者来说,这种情况带来的影响是非常直接的。如果是单个结果,那么基准测试方法可以将其返回,而且该框架要确保暗中将这个值赋值到某个地方(黑洞),这是框架作者开发的一种机制,其性能开销可以忽略不计。

如果一个基准测试要执行多个计算,那么将该方法的结果组合起来并返回的成本可能会很高。在这种情况下,作者可能需要使用一个显式的黑洞,具体做法是创建一个以Blackhole为参数的基准测试。

Java性能优化实践p73

[图1 还没隔离前浦东图书馆照]

Java性能优化实践p73

[图2 还没隔离前浦东图书馆照]

继续阅读