JMH 测试

JMH的作用

代码工具:jmh
JMH是一个用于构建,运行和分析以Java和其他语言编写的面向JVM的nano / micro / milli / macro基准测试的Java代码库。

相关注解:


//------------------------------------
@State注释定义了给定类的实例可用的范围(JMH允许您同时在多个线程中运行测试)


名称         描述
Scope.Thread 这是一个默认状态。将为运行给定测试的每个线程分配一个实例。
Scope.Benchmark 运行相同测试的所有线程将共享一个实例。可以用来测试状态对象的多线程性能(或者只是用这个范围标记你的基准)。
Scope.Group 将为每个线程组分配一个实例(请参阅下面的组部分)。


//------------------------
@BenchmarkMode在测试方法中使用注释指定的以下测试模式:


名称                  描述
Mode.Throughput          以时间单位计算操作次数。
Mode.AverageTime 计算平均运行时间。
Mode.SampleTime          计算运行方法需要多长时间(包括百分位数)。
Mode.SingleShotTime 只需运行一次方法(对冷测试模式有用)。或者如果您为迭代指定了批处理大小,则不止一次(参                           见@Measurement下面的注释) - 在这种情况下,JMH将计算批处理运行时间(批处理中所有调用的 总时间)。
任何一组这些模式 您可以指定任何一组这些模式 - 测试将运行多次(取决于所需模式的数量)。
Mode.All          所有这些模式一个接一个。


//----------------------------------
Junit测试
@Setup
完成测试前的初始化工作
@teardown 完成测试完成后的垃圾回收等工作




//-------------------------------------
@OutputTimeUnit     指定时间单位
@OutputTimeUnit(TimeUnit.SECONDS)
TimeUnit是java.util.concurrent包下面的一个类,表示给定单元粒度的时间段
TimeUnit.DAYS          //天
TimeUnit.HOURS         //小时
TimeUnit.MINUTES       //分钟
TimeUnit.SECONDS       //秒
TimeUnit.MILLISECONDS  //毫秒

在Eclipse 中实现一个JMH测试

1.创建maven项目

   1.pom文件:
       <dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.19</version>
<scope>provided</scope>
</dependency>
           添加插件
             <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>run-benchmarks</id>
            <phase>integration-test</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <classpathScope>test</classpathScope>
                <executable>java</executable>
                <arguments>
                    <argument>-classpath</argument>
                    <classpath />
                    <argument>org.openjdk.jmh.Main</argument>
                    <argument>.*</argument>
                </arguments>
            </configuration>
        </execution>
    </executions>
</plugin>
       2.代码编写
           package com.ns.proxy.jmhtest;


import java.io.IOException;
import java.util.concurrent.TimeUnit;


import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
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;


import com.alibaba.fastjson.JSONObject;


@State(Scope.Benchmark) // 给定类的可用范围
@BenchmarkMode(Mode.Throughput) // 指定测试模式
@OutputTimeUnit(TimeUnit.SECONDS) // 指定时间单位
public class JMHTestProxy {


String url = "";
String dubbo = "";
JSONObject entity = new JSONObject();


public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()//
.include(JMHTestProxy.class.getSimpleName())//
.warmupIterations(2)// 预热次数
.measurementIterations(10)// 真正执行的次数
.forks(1).build();
new Runner(opt).run();
}


@Setup
public void setup() {
url = "http://192.168.201.162:10007/web/";
dubbo = "http://192.168.201.162:10009/trsdc/tradition/search";
entity.put("pageNo", 1);
entity.put("query",
"IR_CONTENT:((\"中国比特币\" OR \"中国比特币\" OR \"中国比特币\")的) AND IR_LOADTIME:[20151207 TO 201712018]");
entity.put("pageSize", 1);
}


/**
* 需要测试的方法
*/


@Benchmark
public void bufferLoop() {

}


@TearDown
public void getAvgOut() {


}




}

 2.编译

   项目代码完成后不要直接执行:
      在eclipse中runas:
1.maven clean 
2.maven generator-source
3.maven install
  以此来创建BenchmarkList文件



3.遇到的错误

可能一:
一台主机只能运行一个jmh的Java项目
Exception in thread "main" org.openjdk.jmh.runner.RunnerException: ERROR: Unable to acquire the JMH lock (C:\Users\ADMINI~1\AppData\Local\Temp\/jmh.lock): already taken by another JMH instance, exiting. Use -Djmh.ignoreLock=true to forcefully continue.
at org.openjdk.jmh.runner.Runner.run(Runner.java:202)
at com.ns.bloomfilter.JMHTestBloomFilterFile.main(JMHTestBloomFilterFile.java:34)
可能二:
应该是windows权限导致的,java无法在C:\Windows目录下创建文件。两种解决方案。一种是以管理员权限启动intellij,另一种是如错误提示所说,通过-D参数来修改java的系统属性。我选择了前者略微简单一点。


//缺少插件
Exception in thread "main" java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkList
at org.openjdk.jmh.runner.AbstractResourceReader.getReaders(AbstractResourceReader.java:98)
at org.openjdk.jmh.runner.BenchmarkList.find(BenchmarkList.java:122)
at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:256)
at org.openjdk.jmh.runner.Runner.run(Runner.java:206)
at Example.example.JMHSample_01_HelloWorld.main(JMHSample_01_HelloWorld.java:32)


解决办法:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>run-benchmarks</id>
<phase>integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<classpathScope>test</classpathScope>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>org.openjdk.jmh.Main</argument>
<argument>.*</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值