JMH 的使用及示例
JMH 的使用及示例
KongFanhao 发表于1年前
JMH 的使用及示例
  • 发表于 1年前
  • 阅读 394
  • 收藏 2
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 偶然在博客中看到JMH这个东西,因为之前都是用System.currentTimeMillis()来计算程序运行时间的,现在推荐大家用JMH。JMH是Java的微基准测试框架,相对于时间打点的方式来说,JMH统计的是程序预热之后CPU真正的执行时间,剔除了解释、等待CPU分配时间片等时间,所以统计结果更加具备真实性。

1.JMH的介绍

 JMH是新的microbenchmark(微基准测试)框架(2013年首次发布)。与其他众多框架相比它的特色优势在于,它是由Oracle实现JIT的相同人员开发的。特别是我想提一下Aleksey Shipilev和他优秀的博客文章。JMH可能与最新的Oracle JRE同步,其结果可信度很高。

  
2. 使用JMH

使用JMH仅需满足2个必要条件(其他所有都是建议选项):

  •     设置jmh-core的maven依赖
  •  使用注解测试方法

2.1 在pom.xml中添加如下内容:

<dependencies>
		<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
		<dependency>
			<groupId>org.openjdk.jmh</groupId>
			<artifactId>jmh-core</artifactId>
			<version>1.15</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-generator-annprocess -->
		<dependency>
			<groupId>org.openjdk.jmh</groupId>
			<artifactId>jmh-generator-annprocess</artifactId>
			<version>1.15</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
</dependencies>

2.2 安装m2e-apt

在eclipse market中搜索m2e 找到这个:

并安装

2.3 在IDE的preference中勾选自动启动 apt

在eclipse:  windows-> preference-> Maven->Annotation Processing中 勾选第一个选项 如图:

 

3 demo

官方有个jmh的示例 helloworld

http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

我再附一个例子,测试两个方法的性能:

package jmh;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@State(value = Scope.Benchmark)
public class Test {
	
	private int a[] = new int[5];

	@Benchmark
	@BenchmarkMode(Mode.SampleTime)
	public void badTry() {
		int result = 0;
		int i = 0;
		try {
			while (true) {
				result += this.a[i++];
			}
		} catch (ArrayIndexOutOfBoundsException e) {
			// do nothing
		}
	}

	@Benchmark
	@BenchmarkMode(Mode.SampleTime)
	public void goodTry() {
		int result = 0;
		for (int i = 0; i < a.length; i++) {
			result += this.a[i];
		}
	}

	
	public static void main(String[] args) throws RunnerException {

		Options opt = new OptionsBuilder()

				.include(Test.class.getSimpleName())

				.forks(0)

				.build();

		new Runner(opt).run();

	}
	

}

需要注意的是,运行jmh main 中就是这样写的,然后在方法上加上注解就可以跑了

 

 

 

标签: jmh demo 使用
共有 人打赏支持
粉丝 5
博文 75
码字总数 42265
×
KongFanhao
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: