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>

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

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

(0)
上一篇 2022年7月11日 上午8:16
下一篇 2022年7月11日 上午8:36


相关推荐

  • Java封装动态编译

    Java封装动态编译java 实现字符串的动态编译

    2026年3月18日
    2
  • 如何识别并解决复杂的dcache问题

    如何识别并解决复杂的dcache问题背景 这个是在 centos7 6 的环境上复现的 但该问题其实在很多内核版本上都有 如何做好对 linux 一些缓存的监控和控制 一直是云计算方向的热点 但这些热点属于细分场景 很难合入到 linux 主基线 随着 ebpf 的逐渐稳定 对通用 linux 内核的编程 观测 可能会有新的收获 下面列一下我们是怎么排查并解决这个问题的 一 故障现象 oppo 云内核团队发现集群的 snmpd 的 cpu 消耗冲高 snmpd 几乎长时间占用一个核 perf 发现热点如下 92 00 3 96 kernel

    2026年3月26日
    2
  • 🔥🔥🔥玩转OpenClaw|云上OpenClaw最全教程合辑

    🔥🔥🔥玩转OpenClaw|云上OpenClaw最全教程合辑

    2026年3月15日
    2
  • mysql中分组排序_oracle先分组后排序

    mysql中分组排序_oracle先分组后排序文章目录MySQL窗口函数(分组内排序、筛选)简介与GROUPBY区别窗口函数语法`partition_clause`句法`order_by_clause`句法`frame_clause`句法MySQL窗口函数列表聚合函数+over()排序函数+over()ntile()函数+over()first_value()函数+over()lag()函数+over()last_value()函数+over()lead()函数+over()nth_value()函数+over(

    2026年4月15日
    7
  • 【最新教程】OpenClaw(原Clawdbot/Moltbot)本地部署快速指南

    【最新教程】OpenClaw(原Clawdbot/Moltbot)本地部署快速指南

    2026年3月15日
    2
  • 软件测试面试自我介绍

    软件测试面试自我介绍面试官 上午 下午好 我是 XXX 今天来面试贵公司的软件测试工程师岗位 接下来 我介绍一下我自己 提前知道和了解企业的招聘要求和技能要求 提前做好应对 技能点描述要有针对性 1 我会 Linux 系统操作和相关命令的使用 项目中搭建过测试环境 2 用过 MySQL 数据库 能使用 SQL 语句进行数据查询 有时候测试需要进行提交数据和查询数据的对比时 在数据库中查询数据 3 我会 Python 开发语言 可以用于 Selenium 的测试脚本编写 项目要求对一部分固定的功能进行自动化测试脚本的实现 使用 unitt

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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