大家好,又见面了,我是你们的朋友全栈君。
JMH的作用
相关注解:
@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项目
<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>
<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>
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.编译
1.maven clean
2.maven generator-source
3.maven install
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>
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157354.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...