java-benchmark

java 基准测试

JMH (Java Microbenchmark Hardness) 微基准测试,专门用于代码微基准测试的工具套件;主要用于基于方法层面的微基准测试

精度可达到纳秒级别。

使用场景:当定位到热点方法时,希望进一步优化性能,就可以使用微基准测试;

预热处理:在微基准测试中我们希望看到的程序执行效率是 JVM 直接执行机器码的速度;因此,在执行真正的微基准测试之前需要对代码进行预热

(先执行几次,JVM 就会生成机器码),这也就是 JMH 提供的"预热处理"。

项目结构

|- openjdk-officia // OpenJDK 官方的测试 demo 供参考

|- jmh-demo // 自己在平时学习时加入的基准测试,包含 JMH 使用式样;(字符串拼接,列表,序列化等)

|- mapperstruct // 针对mapStruct 框架的对象映射做测试;

|- spring-framework // 收录 spring-framework 官方的基准测试,也加入自己在开发过程中遇到的相关的测试;

|- java-coroutines // java 协程相关的基准测试

使用说明

在 IDEA 中执行基准测试时,使用 Run 的方式,不能使用 Debug;

执行报错,最好执行一次 mvn clean 再进行尝试;

JMH 在编译的时候会对循环进行优化,如果发现某个变量没有被使用会被优化掉:

public class MyBenchmark {

@Benchmark

public void testMethod() {

int a = 1;

int b = 2;

int sum = a + b; // Dead Code

}

}

改为 return sum , 这样就不会被编译器优化掉,从而测出比较准确的结果;

基础概念

OPS 每秒操作量,衡量性能的重要指标;

QPS 每秒查询量,对每次执行的时间进行升序排列,取总数的 99% 的最大执行时间作为 T99,表示 99% 的请求响应不超过某个值;

常用注解

BenchmarkMode 使用模式;

Mode.Throughput : 吞吐量;

Mode.AverageTime: 响应时间;

Mode.SampleTime: 采样时间;

Mode.All: 表示统计以上所有指标;

Warmup: 预热, 默认预热1次;

Measurement: 配置执行次数(Iterator)和执行时间/每次(time)

Thread:同时多少个线程执行;

Fork: 多个单独进程,分别测试每个方法;(每个方法多少进程)

OutputTimeUnit:统计结果的时间单元;

State 对象的生命周期:@State(Scope.Benchmark)

在类上使用,State 中注明某些变量是 Thread 生效或者整个测试都生效 Benchmark

@State(Scope.Benchmark)

public class MyBenchmarkStateSimple {

AreaService areaService = new AreaService();

PreferAreaService perferAreaService = new PreferAreaService();

List data = buildData(20);

//忽略其他代码

}

运行结果

Result "com.lab.jmh.test.MyBatchmarkDemo.testBefore":

144330.689 ±(99.9%) 3986.539 ops/s [Average]

(min, avg, max) = (139887.020, 144330.689, 147419.834), stdev = 2636.848

CI (99.9%): [140344.150, 148317.228] (assumes normal distribution)

# Run complete. Total time: 00:05:01

REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on

why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial

experiments, perform baseline and negative tests that provide experimental control, make sure

the benchmarking environment is safe on JVM/OS/HW level, ask forreviews from the domain experts.

Do not assume the numbers tell you what you want them to tell.

Benchmark Mode Cnt Score Error Units

MyBatchmarkDemo.testAfter thrpt 10 125335.652 ± 25823.147 ops/s

MyBatchmarkDemo.testBefore thrpt 10 144330.689 ± 3986.539 ops/s

stdev: 标准差,反应数值相对于平均值的离散程度;

CI(Corfindence interval):置信区间,这里相当于处理能力的一个估计区间;在统计学中,置信区间反应了当前样本的某个总体

参数的区间估计;

相关文章

参与贡献

Fork 本仓库

新建 Feat_xxx 分支

提交代码

新建 Pull Request

benchmark java_Xudong相关推荐

  1. 第7章 分析恶意的windows程序

    1. windows API 1.1类型和匈牙利表示法 windows API使用的变量名会使用前缀来说明它的类型,是一种命名规范 windows API的常见类型 1.2 句柄 在windows中表 ...

  2. 基于深度学习的点云配准Benchmark

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨千百度@知乎 来源丨https://zhuanlan.zhihu.com/p/289620126 ...

  3. apache bench linux,linux – 如何在CentOS上安装Apache Benchmark?

    我尝试在我的centos上使用 Is there a way to install Apache Bench (ab) without installing apache解决方案安装Apache Be ...

  4. Sebastian Ruder 发文:Benchmark 的挑战与机遇!

    过去数年,在迁移学习的推动下,NLP的模型变得越来越强大.性能快速提升的AI算法,使得现在面向AI性能的基准测试变得有些落后.例如,近来不断涌现的AI模型,在SuperGLUE.SQuAD等标准基准上 ...

  5. 华为开源CTR Benchmark,学术界SOTAs的照妖镜?

    来源 | 夕小瑶的卖萌屋作者 | 卖萌酱 众所周知,与CV.NLP不同,搜索.广告.推荐领域的学术界paper在很多问题上喜欢各玩各的,缺乏一个统一可比的benchmark. 就推荐/广告中核心的CT ...

  6. ICLR 2020| 最新NAS benchmark:0.1秒完成NAS算法搜索

    2020-01-19 16:37 专题:ICLR 2019 导语:ICLR论文解读~ 雷锋网AI科技评论按:本文对悉尼科技大学博士生董宣毅发表于 ICLR 2020 的录用Spotlight论文< ...

  7. [转载]什么情况下应该设置 cudnn.benchmark = True?

    总的来说,大部分情况下,设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题. 一般来讲,应该遵循以下准则: 如果网络的输 ...

  8. 中国最大AI芯片发布,顺手拿下四个国内第一,带Benchmark的那种

    金磊 发自 上海 量子位 报道 | 公众号 QbitAI 上回书说到--<一份邀请函引发的中国芯片新猜想>. 于是乎,我为了验证这个猜想是否正确,特此前来上海一探究竟. 直接揭晓答案:猜对 ...

  9. 说人话,搜代码,Facebook发布神经代码搜索数据集+benchmark

    郭一璞 发自 中关村 量子位 报道 | 公众号 QbitAI 怎么才能方便的找自己需要的代码? 最好是能用人话来直接搜索.说什么就给什么那种. Facebook刚刚发布了新benchmark和数据集, ...

最新文章

  1. 贪吃蛇python零基础教程_自学python-tkinter项目-贪吃蛇的程序(0基础入门学习)...
  2. openstack组件之nova
  3. 马斯克的SpaceX又双叒叕融资了:喜提131亿,估值破3000亿
  4. java8 map reduce 分组_java8快速实现List转map 、分组、过滤等操作
  5. Opencv——几何空间变换(仿射变换和投影变换)
  6. oracle添加伪列,Oracle伪列 - jifengtang的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 音乐计算机怎么用,如何利用电脑录制自己的歌曲(音乐)
  8. 使用csc手动编译cs文件
  9. 【clickhouse】如何监控Clickhouse的连接数
  10. python第二十二天,configparser模块 subprocess 模块,xlrd 模块(表格处理)
  11. [转精]IO_STACK_LOCATION与IRP的一点笔记
  12. 常用的linux巡检命令,linux常用巡检命令
  13. Hi3519A 开发板重装系统(烧写uboot、kernel、fs) + 重新加载驱动
  14. 程序员联合开发网 程序员创业指导书
  15. System.InvalidOperationException:“在应用程序配置文件中找不到名为“LDOAEntities”的连接字符串。”
  16. 【操作系统】第一章 概论 冲鸭!!
  17. C++中运行一个程序的内存分配情况及qt中的内存管理机制
  18. 微信公众号网页H5跳转微信小程序
  19. c3p0,DBCP,Druid(德鲁伊)数据库连接池
  20. 数据中心交钥匙项目部署仍面临挑战

热门文章

  1. anaconda损坏的卸载方式
  2. npm卸载appium,重新安装桌面版appium
  3. Distiller:量化算法
  4. 异常 exception
  5. 第二十六章 使用 CSP 进行基于标签的开发
  6. 「小程序JAVA实战」小程序的个人信息作品,收藏,关注(66)
  7. 非奇异矩阵的多种判断方式
  8. 美式口语发音技巧:《影子跟读》
  9. A man who has iron bone
  10. Spring MVC -- xxx conflicts with existing xxx