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)


相关推荐

  • eth挖矿显卡的选择_挖矿一般用什么显卡

    eth挖矿显卡的选择_挖矿一般用什么显卡以太坊显卡挖矿指南1.显卡篇挖矿靠显卡核心计算,所以AMD显卡比NVIDA卡更高效。选择AMD卡,要求显卡显存大于2G,推荐购买4G显存显卡.目前市面上可购选择的显卡品牌型号还有速度.蓝宝石-影驰-技嘉-索泰-讯景-微星-迪兰-盈通#显卡型号操作系统挖矿速度驱动版本显卡功耗

  • 分享一下最近的面试题,都是大厂

    分享一下最近的面试题,都是大厂

  • Java优先级队列PriorityQueue「建议收藏」

    Java优先级队列PriorityQueue「建议收藏」目录普通队列对比优先级队列:逆序优先级队列自定义优先级队列的优先级相较于普通先进先出队列来说,优先级队列会根据优先级进行由高到低排序,出队时优先级高的先出队。普通队列对比优先级队列:1.普通队列:importjava.util.LinkedList;importjava.util.Queue;publicclassMainTest{publicstaticvoidmain(String[]args){ Queue<Integer>queue

  • 使用panel1,切换页面

    使用panel1,切换页面定义变量UserControl1urs1_Control;UserControl2urs2_Control;UserControl3urs3_Control;UserControl4u

  • 树莓派更换pip源

    树莓派更换pip源注:pip更换为国内源,可以大大的提高安装成功率和速度。不管你用的是pip3还是pip,方法都是一样的,如下:例:这里举例换豆瓣源(个人认为它比较好用)先创建这个文件vim~/.pip/pip.conf在里面添加如下内容:[global]timeout=6000index-url=http://pypi.douban.com/simple/[install]use-mi…

  • 大数据开发工作累吗?

    大数据开发工作累吗?在大数据时代的背景下,出现了另一类程序员—大数据开发工程师,他们因为掌握着前沿的大数据相关技术,深受企业重视,找工作容易收入也非常高,但作为IT行业的又一分类,是否加班牵动了无数转行者的心!对于大数据开发工作是否加班的这个问题,不能一概而论,需根据公司的实际情况而定,有些公司有加班的氛围,即使非IT岗,也会有加班的情况,这样的公司大数据开发肯定会加班无疑的;有些公司不鼓励加班,会根据大数据开发…

发表回复

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

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