文档章节

JMH 的使用及示例

KongFanhao
 KongFanhao
发布于 2016/10/09 11:44
字数 528
阅读 429
收藏 2
点赞 0
评论 0

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 中就是这样写的,然后在方法上加上注解就可以跑了

 

 

 

© 著作权归作者所有

共有 人打赏支持
KongFanhao
粉丝 5
博文 75
码字总数 42265
作品 0
海淀
程序员
使用JMH做Java微基准测试

在使用Java编程过程中,我们对于一些代码调用的细节有多种编写方式,但是不确定它们性能时,往往采用重复多次计数的方式来解决。但是随着JVM不断的进化,随着代码执行次数的增加,JVM会不断的...

weipeng2k ⋅ 01/04 ⋅ 0

BenchMark工具-JMH介绍

JMH是有OpenJDK开发的基准测试(Benchmark)工具。JMH可以为写基准测试和运行测试提供很好的支持。JMH在Concurrent Benchmarks也提供很好的支持,可以说是多功能测试工具。JMH在2013被公布出...

robin-yao ⋅ 2015/04/29 ⋅ 0

如何度量你的程序的性能

Java下如何做基准测试 你是否经常用这样的代码来度量代码性能: 那么,你应该继续往下看. 基准测试面临的问题 仔细阅读 《健壮的 Java 基准测试》 这篇文章,详细介绍了Java基准测试面临的问题,...

彗星麦田圈 ⋅ 2016/12/23 ⋅ 0

使用JMH进行并发测试

Java Benchmark 框架 JUnitBenchmarks() JMH

xixicat ⋅ 2015/07/24 ⋅ 0

用 JMH 检测 Lambdas 序列化性能

本文将介绍如何进行 Java Lambdas 序列化性能检测、Lambdas 的重要性以及 Lambdas 在分布式系统中的应用。 Lambdas 表达式是 Java 8 中万众期待的新特性,其若干用途包括: 为匿名内部类减少...

OneAPM蓝海讯通 ⋅ 2015/12/18 ⋅ 0

java自动装箱性能

Java 的基本数据类型(int、double、 char)都不是对象。但由于很多Java代码需要处理的是对象(Object),Java给所有基本类型提供了包装类(Integer、Double、Character)。有了自动装箱,你...

皮蛋瘦肉粥里没有粥 ⋅ 2016/03/02 ⋅ 0

xsequence 分布式序列号生成组件 1.3 发布

项目介绍 微服务时代,我们需要生产一个连续的友好的序列号,例如订单号等。变得比较麻烦。 这里我提供了两种业界常用的解决方案来实现这个分布式序列号生成组件。 使用集中式存储功能取步长...

徐安是个好人 ⋅ 05/31 ⋅ 0

基准测试之构建性能模型

序 基准测试业务逻辑是非常困难的,很多时候基准测试是基于时间来衡量的,很多人认为这些时间很容易得到,并且认为获取系统时间的消耗很微不足道,我们可以基于获取系统的时间来测量任何我们...

Float_Luuu ⋅ 2016/03/19 ⋅ 0

优化技巧:提前if判断帮助CPU分支预测

分支预测 在stackoverflow上有一个非常有名的问题:为什么处理有序数组要比非有序数组快?,可见分支预测对代码运行效率有非常大的影响。 现代CPU都支持分支预测(branch prediction)和指令流...

中间件小哥 ⋅ 06/01 ⋅ 0

Java 8 的 JVM 有多快?Fork-Join 性能基准测试

Java 8 已经发布一段时间了,许多开发者已经开始使用 Java 8。本文也将讨论最新发布在 JDK 中的并发功能更新。事实上,JDK 中已经有多处 改动,但本文重点将是 Fork-Join 框架的改进。我们将...

OneAPM蓝海讯通 ⋅ 2015/12/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部