JMH 测试「建议收藏」

JMH 测试「建议收藏」JHM测试框架

大家好,又见面了,我是你们的朋友全栈君。

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>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157354.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • spring事务回滚的多种方式「建议收藏」

    spring事务回滚的多种方式「建议收藏」转:https://www.cnblogs.com/zeng1994/p/8257763.htmlstart看下下面的说明,会对理解本人贴出的代码有帮助。1.代码中事务控制的3种方式编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚。优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了。声明式事务:就是使用SpringAop配置事务,这种方式大大的简化了编码。需要注…

    2022年10月19日
  • springboot框架流程图_java流程框架

    springboot框架流程图_java流程框架这篇介绍springboot的框架流程控制(Controller)层,负责具体的业务模块流程的控制,也就是去拦截客户发来的请求。然后服务(Service)层,负责业务模块的逻辑应用设计,调用DAO层已定义的接口,去实现Service具体的实现类,也就是去和数据库(DAO)层打交道。Dao(serviceImpl)层负责与数据库进行交互设计,用来处理数据的持久化工作,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。最后一层View层,负责前台h

  • don\’t have permission access on this server听语音

    don\’t have permission access on this server听语音

  • collection与collections区别

    collection与collections区别collection是一个接口。         他抽取出各种集合&lt;继承List和Set&gt;的主要功能,并做出统一行为规范。          他是很多集合的祖辈接口,没错父辈接口是List和Set。Collections是一个工具类。           工具类是工具,就像Math,Arrays类一样,他是一种工具,集成了很多特定的功能。           比如排…

  • RPC接口实现_一个接口多个实现

    RPC接口实现_一个接口多个实现1.RPC作用以目前的认识,RPC的作用:多个工程之间数据传输。2.逐步完成RPC接口实现第一步:编写thrift文件,语法格式和java不同。在布局分层里安排在了client层

    2022年10月13日
  • 关于struts2的error filterStart问题的解决

    关于struts2的error filterStart问题的解决eclipse下部署好项目启动的时候出现errorfilterStart错误,参考了网上的资料,发现很多人遇到。有一篇帖子帮到了我。是关于这个问题的总结。根据那个帖子的提示,我认为是我的tomcat安装路径的问题。我的tomcat安装在了d:\programfiles下,后来我将tomcat移到了D盘根目录下重新部署启动,问题就没有了。至于为什么会这样,那个帖子上有一个解释,但是我不是太明白。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号