JMH基准测试框架

  • 显示原文与译文双语对照的内容
文章标签: Gradle   JMH   基准   INT   benchmark   framework     
Integrates the JMH benchmarking framework with Gradle
 

jmh-gradle-plugin源代码下载

  • Git URL:
    复制代码
    git://www.github.com/melix/jmh-gradle-plugin.git
  • Git Clone代码到本地:
    复制代码
    git clone http://www.github.com/melix/jmh-gradle-plugin
  • Subversion代码到本地:
    复制代码
    $ svn co --depth empty http://www.github.com/melix/jmh-gradle-plugin
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
 
JMH Gradle插件

Build Status (travis)Coverage Status (coveralls)DownloadApache License 2

这个插件集成了 JMH微基准测试框架( ) 和 Gradle。

用法

生成用于所有Gradle版本的脚本 Fragment:

build.gradle
复制代码
buildscript {
 repositories {
 jcenter() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "me.champeau.gradle:jmh-gradle-plugin:0.4.5" } } apply plugin: "me.champeau.gradle.jmh"

构建 Gradle 2.1中引入的新的,孵化的插件机制的脚本 Fragment:

build.gradle
复制代码
plugins {
 id "me.champeau.gradle.jmh" version "0.4.5"}

要使用的插件版本?

Gradle插件版本
 

4.3

0.4.5

4.2

0.4.4

4.1

0.4.4

配置

插件使得集成到现有的项目中很容易,因为它有一个特定的配置。 尤其是,基准源文件应该在 src/jmh目录中找到:

复制代码
src/jmh
 |- java : java sources for benchmarks |- resources : resources for benchmarks

插件创建一个 jmh 配置,如果基准文件依赖 3rd 方库,则应该使用该配置。 例如如果要使用 commons-io,则可以添加如下所示的依赖项:

build.gradle
复制代码
dependencies {
 jmh 'commons-io:commons-io:2.4'}

插件使用 JMH 1.19. 你可以通过更改 dependencies 块中的版本来升级版本:

build.gradle
复制代码
dependencies {
 jmh 'org.openjdk.jmh:jmh-core:0.9' jmh 'org.openjdk.jmh:jmh-generator-annprocess:0.9'}

命令行任务

项目将添加以下几个任务:

  • jmhClasses: 编译原始基准代码

  • jmhRunBytecodeGenerator: 通过原始基准代码运行字节码生成器并生成实际基准

  • jmhCompileGeneratedClasses: 编译生成的基准

  • jmhJar: 构建包含JHM运行时和编译后的基准类的JMH jar

  • jmh: 执行基准测试

jmh 任务是主要任务,取决于其他任务,因此执行这里任务通常足够:

复制代码
gradle jmh

配置选项

默认情况下,将执行所有基准测试,并且结果将生成到 $buildDir/reports/jmh。 但是,由于 jmh配置块,你可以更改各种选项。 除了 include 之外的所有配置变量都是未设置的,这意味着它们回退到默认的JMH值:

转载于:https://www.cnblogs.com/vana/p/10967546.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你一个简单的示例来比较并行流和串行流在 jmh 测试中的性能差异。 假设我们有一个包含 1 百万个整数的列表,并且我们要计算这些数的总和。我们可以使用 Java 8 中的 Stream API 来实现这个任务,而且可以选择使用并行流或串行流来执行计算。 首先,我们来看一下串行流的实现代码: ```java public class SerialStreamBenchmark { private List<Integer> numbers; @Setup public void setup() { numbers = new ArrayList<>(); for (int i = 0; i < 1_000_000; i++) { numbers.add(i); } } @Benchmark public int sum() { return numbers.stream().mapToInt(Integer::intValue).sum(); } } ``` 在上述代码中,我们通过 `@Setup` 注解来初始化包含 1 百万个整数的列表。`@Benchmark` 注解标记了 `sum()` 方法,该方法将列表转换为流,然后通过 `mapToInt()` 方法将流中的元素映射为整数,并最终调用 `sum()` 方法计算它们的总和。 接下来,我们来看一下并行流的实现代码: ```java public class ParallelStreamBenchmark { private List<Integer> numbers; @Setup public void setup() { numbers = new ArrayList<>(); for (int i = 0; i < 1_000_000; i++) { numbers.add(i); } } @Benchmark public int sum() { return numbers.parallelStream().mapToInt(Integer::intValue).sum(); } } ``` 与串行流的实现代码类似,我们只需要将 `stream()` 方法替换为 `parallelStream()` 方法即可将流转换为并行流。 接下来,我们可以使用 jmh 测试这两个实现的性能差异。以下是测试类的代码: ```java public class StreamBenchmarkTest { @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Thread) public static class SerialStreamBenchmarkTest { SerialStreamBenchmark serialStreamBenchmark = new SerialStreamBenchmark(); @Setup public void setup() { serialStreamBenchmark.setup(); } @Benchmark public int sum() { return serialStreamBenchmark.sum(); } } @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Thread) public static class ParallelStreamBenchmarkTest { ParallelStreamBenchmark parallelStreamBenchmark = new ParallelStreamBenchmark(); @Setup public void setup() { parallelStreamBenchmark.setup(); } @Benchmark public int sum() { return parallelStreamBenchmark.sum(); } } public static void main(String[] args) throws RunnerException { Options options = new OptionsBuilder() .include(StreamBenchmarkTest.class.getSimpleName()) .build(); new Runner(options).run(); } } ``` 在上述代码中,我们使用了 `@BenchmarkMode`、`@OutputTimeUnit`、`@Warmup`、`@Measurement`、`@Fork` 和 `@State` 注解来配置 jmh 测试。其中,`@State` 注解指定了测试类的状态,`@Setup` 注解用于初始化测试数据。 最后,我们运行测试类,就可以得到并行流和串行流的性能测试结果了。 需要注意的是,实际的测试结果可能因为硬件环境和测试数据的不同而有所不同,这里只是提供了一个简单的示例来比较并行流和串行流在 jmh 测试中的性能差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值