当前位置: 首页 > news >正文

Java 基准测试

Java 基准测试

  • maven依赖
  • 简单使用
  • 执行多个函数
    • @BenchmarkMode(Mode.AverageTime) 运行模式
    • @OutputTimeUnit(TimeUnit.NANOSECONDS) 报告结果时间单位
    • @Warmup(iterations = 5,time = 1,timeUnit = TimeUnit.SECONDS) 预热参数
    • @Measurement(iterations = 5,time = 1,timeUnit = TimeUnit.SECONDS,batchSize = 1) 与预热参数类似
    • @Fork(5) 整体测试次数
    • @State(Scope.Benchmark) 配置对象作用域
    • @OperationsPerInvocation(COUNT) 允许与基准进行多个操作的通信

maven依赖

<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.36</version></dependency><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.36</version></dependency>

简单使用

package com.chauncy.benchmark;import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
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;@State(Scope.Thread)
public class BenchmarkTest1 {double pi = Math.PI;@Benchmarkpublic void measure(){pi++;}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(BenchmarkTest1.class.getSimpleName()).forks(1).build();new Runner(opt).run();}
}

执行多个函数

package com.chauncy.benchmark;import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
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 java.security.SecureRandom;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;@State(Scope.Benchmark)
@BenchmarkMode(Mode.All)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS, batchSize = 1)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS, batchSize = 1)
@Fork(5)
public class BenchmarkTest2 {private static final int COUNT = 1 ^ 21;private byte[] sorted;private byte[] unsorted;@Setuppublic void setup() {sorted = new byte[COUNT];unsorted = new byte[COUNT];SecureRandom random = new SecureRandom();random.nextBytes(sorted);random.nextBytes(unsorted);Arrays.sort(sorted);}@Benchmark@OperationsPerInvocation(COUNT)public void sorted(Blackhole bh1, Blackhole bh2) {for (byte b : sorted) {if (b > 0) {bh1.consume(b);} else {bh2.consume(b);}}}@Benchmark@OperationsPerInvocation(COUNT)public void unsorted(Blackhole bh1, Blackhole bh2) {for (byte b : unsorted) {if (b > 0) {bh1.consume(b);} else {bh2.consume(b);}}}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(".*" + BenchmarkTest2.class.getSimpleName() + ".*").forks(1).build();new Runner(opt).run();}
}

@BenchmarkMode(Mode.AverageTime) 运行模式

@BenchmarkMode(Mode.Throughput) 吞吐量模式 获取单位时间内的操作数量
@BenchmarkMode(Mode.AverageTime) 平均时间模式 获取每次操作的平均时间
@BenchmarkMode(Mode.SampleTime) 函数运行时间采样模式
@BenchmarkMode(Mode.SingleShotTime)  单次操作时间
@BenchmarkMode(Mode.All) 采用所有的模式

@OutputTimeUnit(TimeUnit.NANOSECONDS) 报告结果时间单位

@Warmup(iterations = 5,time = 1,timeUnit = TimeUnit.SECONDS) 预热参数

iterations 预热的迭代次数
time预热时间
timeUnit 预热时间单位
batchSize 每个基准方法调用次数

@Measurement(iterations = 5,time = 1,timeUnit = TimeUnit.SECONDS,batchSize = 1) 与预热参数类似

@Fork(5) 整体测试次数

@State(Scope.Benchmark) 配置对象作用域

Scope.Benchmark 基准状态范围
Scope.Group 组状态范围
Scope.Thread 线程状态范围

@OperationsPerInvocation(COUNT) 允许与基准进行多个操作的通信

相关文章:

Java 基准测试

Java 基准测试maven依赖简单使用执行多个函数BenchmarkMode(Mode.AverageTime) 运行模式OutputTimeUnit(TimeUnit.NANOSECONDS) 报告结果时间单位Warmup(iterations 5,time 1,timeUnit TimeUnit.SECONDS) 预热参数Measurement(iterations 5,time 1,timeUnit TimeUnit.SEC…...

普通护照出国免签及落地签国家和地区

1.互免签协议的国家&#xff08;双向免签&#xff09; 序号 协议国 限制条件 生效日期 1 阿联酋 停留不超过30天 2018.01.16 2 巴巴多斯 停留不超过30天 2017.06.01 3 巴哈马 停留不超过30天 2014.02.12 4 白俄罗斯 停留不超过30天 2018.8.10 5 波黑 停留不超…...

20230219 质心和重心的区别和性质

质心&#xff1a;&#xff08;无需重力场的前提&#xff09;所有质点的位置关于它们的质量的加权平均数。 重心&#xff1a;&#xff08;需要重力场的前提&#xff09;重力对系统中每个质点关于重心的力矩之和为零。 质心&#xff1a; xˉ∑i1nmixi∑i1nmi,yˉ∑i1nmiyi∑i1nmi…...

maven多环境配置

maven多环境配置 参考网址: https://mp.weixin.qq.com/s/-e74bd2wW_RLx7i4YF5M2w https://mp.weixin.qq.com/s/3p53kBHqys58QdMme6lR4A 项目地址 https://gitee.com/shao_ming314/maven-profile-dir 项目说明 该项目基于目录进行多环境配置 , 具体的配置文件在 src/resource…...

设计模式之中介模式与解释器模式详解和应用

目录1 中介模式详解1.1 中介模式的定义1.1.1 中介者模式在生活场景中应用1.1.2 中介者模式的使用场景1.2 中介模式的通用实现1.2.1 类图设计1.2.2 代码实现1.3 中介模式应用案例之聊天室1.3.1 类图设计1.3.2 代码实现1.4 中介者模式在源码中应用1.4.1 jdk中Timer类1.5 中介者模…...

2023年全国最新交安安全员精选真题及答案1

百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、单选题&#xff1a; 1.对施工组织设计中的安全技术措施或者专项施工方案是否…...

chrome插件开发备忘录

文章目录前言要点通信方式注意事项参考前言 第一次接触到插件开发&#xff0c;起因是我用了十多年的一键上传需要升级了。之前的版本来自于有道云&#xff0c;是通过在书签栏加一个书签&#xff0c;然后将上传功能注入到当前页面的方式来实现的。一直也用得挺好&#xff0c;挺…...

实例1:控制树莓派板载LED灯闪烁

实例1&#xff1a;控制树莓派板载LED灯闪烁 实验目的 通过背景知识学习&#xff0c;了解四足机器人mini pupper搭载的微型控制计算机&#xff1a;树莓派。通过对树莓派板载LED灯的状态读写控制&#xff0c;熟悉树莓派本身的操作及Linux中文件的读写。掌握常见函数time.sleep(…...

华为OD机试题 - 最大排列(JavaScript)

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...

手动创建 vue2 ssr 开发环境

本文和个人博客同步发表 更多优质文章查看个人博客 前言 手动搭建 vue ssr 一直是一些前端开发者的噩梦&#xff0c;因为其中牵扯到很多依赖包之间的配置以及webpack在node中的使用。就拿webpack配置来说&#xff0c;很多前端开发者还是喜欢用webpack-cli脚手架搭建项目。导致…...

RHCE-操作系统刻录工具

Windows 1.准备材料。 一个可用的windows操作系统(下载的时候用迅雷比较快) MSDN, 我告诉你 - 做一个安静的工具站 大于等于8G的U盘 想要安装的系统光盘镜像 U盘烧录工具&#xff08;软碟通&#xff09; UltraISO软碟通中文官方网站 - 光盘映像文件制作/编辑/转换工具 …...

PHP面向对象01:面向对象基础

PHP面向对象01&#xff1a;面向对象基础一、关键字说明二、技术实现1. 定义类2. 类成员三、 访问修饰限定符1. public2. protected3. private4. 空修饰限定符四、类内部对象五、构造和析构1. 构造方法2. 析构方法六、范围解析操作符1. 访问类常量2. 静态成员3. self关键字七、类…...

《爆肝整理》保姆级系列教程python接口自动化(十八)--重定向(Location)(详解)

简介   在实际工作中&#xff0c;有些接口请求完以后会重定向到别的url&#xff0c;而你却需要重定向前的url。URL主要是针对虚拟空间而言&#xff0c;因为不是自己独立管理的服务器&#xff0c;所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&…...

MySQL的索引、视图

什么是索引模式(schema)中的一个数据库对象 在数据库中用来加速对表的查询 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放&#xff0c;但不能独立存在&#xff0c;必须属于某个表 由数据库自动维护&#xff0c;表被删除时&#xff0c;该表上的索引自动被…...

【JavaWeb】网络层协议——IP协议

目录 IP协议结构 IP地址管理 特殊IP 解决IP地址不够用 动态分配IP地址 NAT网络地址转换 IPV6 IP协议结构 版本&#xff1a;就是IP协议的版本号。目前只有 4 和 6。这里介绍的是IPV4 首部长度&#xff1a;单位是4字节。于TCP首部长度完全一致&#xff0c;也是可变的&…...

【Python学习笔记】41.Python3 多线程

前言 本章介绍Python的多线程。 Python3 多线程 多线程类似于同时执行多个不同程序&#xff0c;多线程运行有如下优点&#xff1a; 使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人&#xff0c;比如用户点击了一个按钮去触发某些事件的处理…...

Windows 版本ffmpeg编译概述

在使用ffmpeg过程当中&#xff0c;ffmpeg在Linux(包括mac,android)编译非常容易,直接configure,make即可&#xff0c;Android需要交叉编译,在windows就比较麻烦&#xff0c;庆幸的是ffmpeg官方提供已编译好Windows版本的二进制库&#xff08;http://ffmpeg.org/download.html#b…...

NETCore下CI/CD之自动化测试 (详解篇)

NETCore下CI/CD之自动化测试 &#xff08;详解篇&#xff09; 目录&#xff1a;导读 前言 安装JDK 安装 Tomcat 首先&#xff0c;我们需要指定 Tomcat.PID 进程文件&#xff0c;进入 /usr/local/tomcat/bin&#xff0c;编辑文件 增加 tomcat 账户并赋予权限 防止Jeknins…...

Hoeffding不等式剪枝方法

在基于物品的协通过滤算法中&#xff0c;当用户历史行为数据有很多时&#xff0c;对计算会有很大挑战&#xff0c;对此可以使用剪枝对数据进行化简来达到减少计算量。     不是每个物品对都需要进行增量计算。对于两个物品的相似度&#xff0c;每次更新都能够得到一个新的相…...

【算法】数组中的重复数字问题

数组中的重复数据 数组中重复的数字 错误的集合 以第三题&#xff0c;错误的集合为例 对于这样的问题&#xff0c;有很简单的解决方式&#xff0c;先遍历一次数组&#xff0c;用一个哈希表记录每个数字出现的次数&#xff0c;然后遍历一次 [1…N]&#xff0c;看看那个元素重…...

炉石传说自动化脚本终极指南:从3小时到3分钟的游戏体验革命

炉石传说自动化脚本终极指南&#xff1a;从3小时到3分钟的游戏体验革命 【免费下载链接】Hearthstone-Script Hearthstone script&#xff08;炉石传说脚本&#xff09;&#xff08;2024.01.25停更至国服回归&#xff09; 项目地址: https://gitcode.com/gh_mirrors/he/Heart…...

AI浪潮冲击下,前端该何去何从

&#x1f30a; 初级前端工程师&#xff1a;向“深水区”扎根技能树与学习路径定位&#xff1a;面向初级前端开发工程师&#xff0c;聚焦底层原理、工程化思维与可验证的实战输出&#xff0c;构建 AI 时代不可替代的技术护城河。&#x1f4d0; 核心原则&#xff08;避坑指南&…...

深度学习音高检测:5个技巧掌握CREPE实时音高追踪

深度学习音高检测&#xff1a;5个技巧掌握CREPE实时音高追踪 【免费下载链接】crepe CREPE: A Convolutional REpresentation for Pitch Estimation -- pre-trained model (ICASSP 2018) 项目地址: https://gitcode.com/gh_mirrors/cr/crepe CREPE&#xff08;Convoluti…...

DRM驱动(三)之核心模块回调函数解析

1. DRM驱动回调函数的核心作用 如果你曾经在Linux系统下开发过显示驱动&#xff0c;一定会对DRM&#xff08;Direct Rendering Manager&#xff09;框架不陌生。作为现代Linux显示系统的核心&#xff0c;DRM框架通过一系列精心设计的回调函数&#xff0c;让硬件厂商能够灵活地适…...

手把手教你用Python实现熵权PCA:从数据清洗到可视化,一个案例全讲透

用Python实战熵权PCA&#xff1a;电商商品竞争力分析全流程解析 在电商平台的海量商品中&#xff0c;如何快速识别出真正具有竞争力的产品&#xff1f;传统的人工筛选方式不仅效率低下&#xff0c;还容易受到主观偏见的影响。本文将带你用Python实现一个完整的熵权PCA分析流程&…...

封神级C++设计:用3个成员实现可清空、可恢复、零开销的容器(颠覆传统思维)

封神级C设计&#xff1a;用3个成员实现可清空、可恢复、零开销的容器&#xff08;颠覆传统思维&#xff09; 文章目录封神级C\\设计&#xff1a;用3个成员实现可清空、可恢复、零开销的容器&#xff08;颠覆传统思维&#xff09;一、传统方案的“坑”&#xff1a;要么笨重&…...

【刚性 PINN 与时间自适应策略】第九章:综合案例实战:刚性化学反应动力学模拟

目录 9.1 问题描述与数据生成 9.1.1 Robertson 刚性化学反应模型构建 9.1.2 传统 PINN 的失败复现与诊断 第二部分:代码实现 9.1.1.1 三组分反应方程组及其刚性特征分析 9.1.1.2 基准解的生成(使用隐式求解器) 9.1.2.1 训练损失曲线与预测结果的偏差可视化 9.1.2.2 …...

Contriever论文精读:手把手拆解对比学习与MoCo如何‘炼成’通用文本嵌入

Contriever技术解析&#xff1a;对比学习与MoCo如何重塑文本嵌入模型 在自然语言处理领域&#xff0c;文本嵌入模型一直是核心基础技术之一。传统的有监督训练方法虽然在某些特定领域表现出色&#xff0c;但当面临跨领域应用时&#xff0c;其性能往往大幅下降。Facebook Resear…...

频繁冲突?数据静默损坏?Obsidian + 坚果云插件打造工业级笔记同步与容灾方案

在个人知识管理&#xff08;PKM&#xff09;领域&#xff0c;有一条铁律&#xff1a;比“从未备份”更可怕的&#xff0c;是“错误的同步导致的静默覆盖”。 对于 Obsidian 重度用户而言&#xff0c;几千篇 Markdown 笔记是毕生心血。当你兴冲冲地在手机、iPad 和公司电脑之间…...

布隆过滤器与哈希索引:两级验证模型

在高并发、大数据量的系统中&#xff0c;快速判断一个元素是否“已经存在”是一项基础而关键的能力。无论是防止重复提交、抵御缓存穿透&#xff0c;还是实现分布式去重&#xff0c;都需要一种高效的存在性检查机制。实践中&#xff0c;布隆过滤器&#xff08;Bloom Filter&…...