一. 基准测试
基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。
基准测试是一种测量和评估软件性能指标的活动。你可以在某个时候通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试以确定那些变化对性能的影响。
二. JMH
JMH(Java Microbenchmark Harness) 是专门用于进行代码的微基准测试的一套工具API,也支持基于JVM的语言例如 Scala、Groovy、Kotlin。它是由 OpenJDK/Oracle 里面那群开发了 Java 编译器的大牛们所开发的工具。
三. 举例
首先,在 build.gradle 中添加 JMH 所需的依赖
3.1 对比 Sequence 和 List
在 Kotlin 1.2.70 的 release note 上曾说明:
使用 Sequence 有助于避免不必要的临时分配开销,并且可以显着提高复杂处理 PipeLines 的性能。
所以,有必要下面编写一个例子来证实这个说法:
在运行上述代码之前,需要先执行 ./gradlew build
然后,再运行main函数,得到如下的结果。
果然,经过多次链式调用时 Sequence 比起 List 具有更高的效率。
如果把结果导出成json格式,还可以借助 jmh 相关的 gradle 插件生成可视化的报告。
需要依赖到这个插件:https://github.com/jzillmann/gradle-jmh-report
借助 gradle-jmh-report 生成如下的报告:
3.2 内联函数和非内联函数
Kotlin 的内联函数从编译器角度将函数的函数体复制到调用处实现内联,减少了使用高阶函数带来的隐性成本。
尝试编写一个例子:
得到如下的结果。
果然,内联更高效一些。
3.3 协程和RxJava
自从 Kotlin 有协程这个功能之后,经常会有人提起协程和RxJava的比对。
于是,我也尝试编写一个例子,此例子使用的 Kotlin 1.3.10 ,协程的版本1.0.1,RxJava 2.2.4
执行结果如下:
此基准测试采用的是 Throughput 模式,得分越高则性能越好。从得分来看,两者差距不大。(对于两者的比较,我还没有做更多的测试。)
总结
基准测试有很多典型的应用场景,例如想比较某些方法的执行时间,对比接口不同实现在相同条件下的吞吐量等等。在这些场景下,使用 JMH 都是很不错的选择。
关注【Java与Android技术栈】
领取专属 10元无门槛券
私享最新 技术干货