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.互免签协议的国家(双向免签) 序号 协议国 限制条件 生效日期 1 阿联酋 停留不超过30天 2018.01.16 2 巴巴多斯 停留不超过30天 2017.06.01 3 巴哈马 停留不超过30天 2014.02.12 4 白俄罗斯 停留不超过30天 2018.8.10 5 波黑 停留不超…...
20230219 质心和重心的区别和性质
质心:(无需重力场的前提)所有质点的位置关于它们的质量的加权平均数。 重心:(需要重力场的前提)重力对系统中每个质点关于重心的力矩之和为零。 质心: 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
百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题: 1.对施工组织设计中的安全技术措施或者专项施工方案是否…...
chrome插件开发备忘录
文章目录前言要点通信方式注意事项参考前言 第一次接触到插件开发,起因是我用了十多年的一键上传需要升级了。之前的版本来自于有道云,是通过在书签栏加一个书签,然后将上传功能注入到当前页面的方式来实现的。一直也用得挺好,挺…...
实例1:控制树莓派板载LED灯闪烁
实例1:控制树莓派板载LED灯闪烁 实验目的 通过背景知识学习,了解四足机器人mini pupper搭载的微型控制计算机:树莓派。通过对树莓派板载LED灯的状态读写控制,熟悉树莓派本身的操作及Linux中文件的读写。掌握常见函数time.sleep(…...
华为OD机试题 - 最大排列(JavaScript)
最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...
手动创建 vue2 ssr 开发环境
本文和个人博客同步发表 更多优质文章查看个人博客 前言 手动搭建 vue ssr 一直是一些前端开发者的噩梦,因为其中牵扯到很多依赖包之间的配置以及webpack在node中的使用。就拿webpack配置来说,很多前端开发者还是喜欢用webpack-cli脚手架搭建项目。导致…...
RHCE-操作系统刻录工具
Windows 1.准备材料。 一个可用的windows操作系统(下载的时候用迅雷比较快) MSDN, 我告诉你 - 做一个安静的工具站 大于等于8G的U盘 想要安装的系统光盘镜像 U盘烧录工具(软碟通) UltraISO软碟通中文官方网站 - 光盘映像文件制作/编辑/转换工具 …...
PHP面向对象01:面向对象基础
PHP面向对象01:面向对象基础一、关键字说明二、技术实现1. 定义类2. 类成员三、 访问修饰限定符1. public2. protected3. private4. 空修饰限定符四、类内部对象五、构造和析构1. 构造方法2. 析构方法六、范围解析操作符1. 访问类常量2. 静态成员3. self关键字七、类…...
《爆肝整理》保姆级系列教程python接口自动化(十八)--重定向(Location)(详解)
简介 在实际工作中,有些接口请求完以后会重定向到别的url,而你却需要重定向前的url。URL主要是针对虚拟空间而言,因为不是自己独立管理的服务器,所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&…...
MySQL的索引、视图
什么是索引模式(schema)中的一个数据库对象 在数据库中用来加速对表的查询 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放,但不能独立存在,必须属于某个表 由数据库自动维护,表被删除时,该表上的索引自动被…...
【JavaWeb】网络层协议——IP协议
目录 IP协议结构 IP地址管理 特殊IP 解决IP地址不够用 动态分配IP地址 NAT网络地址转换 IPV6 IP协议结构 版本:就是IP协议的版本号。目前只有 4 和 6。这里介绍的是IPV4 首部长度:单位是4字节。于TCP首部长度完全一致,也是可变的&…...
【Python学习笔记】41.Python3 多线程
前言 本章介绍Python的多线程。 Python3 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理…...
Windows 版本ffmpeg编译概述
在使用ffmpeg过程当中,ffmpeg在Linux(包括mac,android)编译非常容易,直接configure,make即可,Android需要交叉编译,在windows就比较麻烦,庆幸的是ffmpeg官方提供已编译好Windows版本的二进制库(http://ffmpeg.org/download.html#b…...
NETCore下CI/CD之自动化测试 (详解篇)
NETCore下CI/CD之自动化测试 (详解篇) 目录:导读 前言 安装JDK 安装 Tomcat 首先,我们需要指定 Tomcat.PID 进程文件,进入 /usr/local/tomcat/bin,编辑文件 增加 tomcat 账户并赋予权限 防止Jeknins…...
Hoeffding不等式剪枝方法
在基于物品的协通过滤算法中,当用户历史行为数据有很多时,对计算会有很大挑战,对此可以使用剪枝对数据进行化简来达到减少计算量。 不是每个物品对都需要进行增量计算。对于两个物品的相似度,每次更新都能够得到一个新的相…...
【算法】数组中的重复数字问题
数组中的重复数据 数组中重复的数字 错误的集合 以第三题,错误的集合为例 对于这样的问题,有很简单的解决方式,先遍历一次数组,用一个哈希表记录每个数字出现的次数,然后遍历一次 [1…N],看看那个元素重…...
炉石传说自动化脚本终极指南:从3小时到3分钟的游戏体验革命
炉石传说自动化脚本终极指南:从3小时到3分钟的游戏体验革命 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Heart…...
AI浪潮冲击下,前端该何去何从
🌊 初级前端工程师:向“深水区”扎根技能树与学习路径定位:面向初级前端开发工程师,聚焦底层原理、工程化思维与可验证的实战输出,构建 AI 时代不可替代的技术护城河。📐 核心原则(避坑指南&…...
深度学习音高检测:5个技巧掌握CREPE实时音高追踪
深度学习音高检测:5个技巧掌握CREPE实时音高追踪 【免费下载链接】crepe CREPE: A Convolutional REpresentation for Pitch Estimation -- pre-trained model (ICASSP 2018) 项目地址: https://gitcode.com/gh_mirrors/cr/crepe CREPE(Convoluti…...
DRM驱动(三)之核心模块回调函数解析
1. DRM驱动回调函数的核心作用 如果你曾经在Linux系统下开发过显示驱动,一定会对DRM(Direct Rendering Manager)框架不陌生。作为现代Linux显示系统的核心,DRM框架通过一系列精心设计的回调函数,让硬件厂商能够灵活地适…...
手把手教你用Python实现熵权PCA:从数据清洗到可视化,一个案例全讲透
用Python实战熵权PCA:电商商品竞争力分析全流程解析 在电商平台的海量商品中,如何快速识别出真正具有竞争力的产品?传统的人工筛选方式不仅效率低下,还容易受到主观偏见的影响。本文将带你用Python实现一个完整的熵权PCA分析流程&…...
封神级C++设计:用3个成员实现可清空、可恢复、零开销的容器(颠覆传统思维)
封神级C设计:用3个成员实现可清空、可恢复、零开销的容器(颠覆传统思维) 文章目录封神级C\\设计:用3个成员实现可清空、可恢复、零开销的容器(颠覆传统思维)一、传统方案的“坑”:要么笨重&…...
【刚性 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技术解析:对比学习与MoCo如何重塑文本嵌入模型 在自然语言处理领域,文本嵌入模型一直是核心基础技术之一。传统的有监督训练方法虽然在某些特定领域表现出色,但当面临跨领域应用时,其性能往往大幅下降。Facebook Resear…...
频繁冲突?数据静默损坏?Obsidian + 坚果云插件打造工业级笔记同步与容灾方案
在个人知识管理(PKM)领域,有一条铁律:比“从未备份”更可怕的,是“错误的同步导致的静默覆盖”。 对于 Obsidian 重度用户而言,几千篇 Markdown 笔记是毕生心血。当你兴冲冲地在手机、iPad 和公司电脑之间…...
布隆过滤器与哈希索引:两级验证模型
在高并发、大数据量的系统中,快速判断一个元素是否“已经存在”是一项基础而关键的能力。无论是防止重复提交、抵御缓存穿透,还是实现分布式去重,都需要一种高效的存在性检查机制。实践中,布隆过滤器(Bloom Filter&…...
