首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JAVA拾遗 — JMH与8个代码陷阱

使用 JMH 解决 12 个测试陷阱 陷阱1:死码消除 ?...这是由于 JIT 擅长删除“无效”的代码,这给我们的测试带来了一些意外,当你意识到 DCE 现象后,应当有意识的去消费掉这些孤立的代码,例如 return。JMH 不会自动实施对冗余代码的消除。...死码消除这个概念很多人其实并不陌生,注释的代码,不可达的代码块,可达但不被使用的代码等等,我这里补充一些 Aleksey 提到的概念,用以阐释为何一般测试方法难以避免引用对象发生死码消除现象: Fast...很绝望,个人水平有限,我没能 get 到这些点,只能原封不动地贴给大家看了。 JMH 提供了专门的 API — Blockhole 来避免死码消除问题。...这个图可供我们提出两个问题: 为什么 2 线程 -> 4 线程几乎没有变化? 为什么 2 线程相比 1 线程只有 1.87 倍的变化,而不是 2 倍? 1 电源管理 ?

1.6K40

Java性能测试利器:JMH入门与实践|得物技术

我将在本教程的后面部分介绍如何使用 JMH 正确的实现基准测试来避免JVM的死代码消除。三、JMH的核心概念和注解基准测试方法使用@Benchmark注解标记需要跑基准测试的方法。...Blackhole:JMH提供的一个机制,用于“吞噬”测试方法的输出,防止JVM的死代码消除优化。...Blackhole消耗:Blackhole是一个JMH提供的工具,用于消耗测试方法的输出,防止JVM优化掉测试代码(例如,死代码消除)。...JVM优化之一是消除死代码。...基准测试根本没有测量任何代码逻辑。避免消除死代码为了避免消除死代码,我们必须确保要测量的代码对JVM来说不像死代码。有两种方法可以做到这一点。从基准测试方法返回代码的结果。

13410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JMH-基准测试框架

    通常用于代码的性能调优,JMH开发者同样为JIT的开发者,得益于专业的JVM优化分析,JMH具有高精度的特点,适用于Java及基于JVM的语言。...# JMH-避免死代码消除陷阱 The downfall of many benchmarks is Dead-Code Elimination (DCE): compilers are smart...引用官方的解释: 许多基准测试的失败是因为死代码消除(DCE),因为编译器足够聪明,可以推断出一些计算是冗余的并完全消除掉他们,如果被淘汰的部分是基准测试的代码,那将引起基准测试的失败(不准确) 死代码陷阱的一个典型场景如下...Math.log(x); } } 上述代码采用void进行返回,使得变量x的结果并没有被用到,JVM优化时会将整个方法的内部代码移除。...JMH提供了2种方式避免该问题: 将变量作为方法的返回值,即此时方法返回double,return Math.log(x) 通过JMH的Blackhole consume避免JIT优化消除 通过JMH插件创建的

    88530

    性能调优必备利器之 JMH

    该工具是由 Oracle 内部实现 JIT 的大牛们编写的,他们应该比任何人都了解 JIT 以及 JVM 对于基准测试的影响。...预热的目的是让 JVM 对被测代码进行足够多的优化,比如,在预热后,被测代码应该得到了充分的 JIT 编译和优化。...比如 JIT 优化中的死码消除,比如以下代码: @Benchmark public void testStringAdd(Blackhole blackhole) { String a = ""...; for (int i = 0; i < length; i++) { a += i; } } JVM 可能会认为变量 a 从来没有使用过,从而进行优化把整个方法内部代码移除掉...JMH 提供了两种方式避免这种问题,一种是将这个变量作为方法返回值 return a,一种是通过 Blackhole 的 consume 来避免 JIT 的优化消除。

    54020

    性能调优必备利器之 JMH

    该工具是由 Oracle 内部实现 JIT 的大牛们编写的,他们应该比任何人都了解 JIT 以及 JVM 对于基准测试的影响。...预热的目的是让 JVM 对被测代码进行足够多的优化,比如,在预热后,被测代码应该得到了充分的 JIT 编译和优化。...比如 JIT 优化中的死码消除,比如以下代码: @Benchmark public void testStringAdd(Blackhole blackhole) { String a = ""...; for (int i = 0; i < length; i++) { a += i; } } JVM 可能会认为变量 a 从来没有使用过,从而进行优化把整个方法内部代码移除掉...JMH 提供了两种方式避免这种问题,一种是将这个变量作为方法返回值 return a,一种是通过 Blackhole 的 consume 来避免 JIT 的优化消除。

    53210

    性能调优必备利器之 JMH

    该工具是由 Oracle 内部实现 JIT 的大牛们编写的,他们应该比任何人都了解 JIT 以及 JVM 对于基准测试的影响。...预热的目的是让 JVM 对被测代码进行足够多的优化,比如,在预热后,被测代码应该得到了充分的 JIT 编译和优化。...比如 JIT 优化中的死码消除,比如以下代码: @Benchmark public void testStringAdd(Blackhole blackhole) { String a = ""...; for (int i = 0; i < length; i++) { a += i; } } JVM 可能会认为变量 a 从来没有使用过,从而进行优化把整个方法内部代码移除掉...JMH 提供了两种方式避免这种问题,一种是将这个变量作为方法返回值 return a,一种是通过 Blackhole 的 consume 来避免 JIT 的优化消除。

    1.1K20

    代码模板 | 我的代码没有else

    嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 ? 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套我总结的使用设计模式的四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 我通过历史上接触过的各种抽奖场景(红包雨、糖果雨、打地鼠、大转盘(九宫格)、考眼力、...------------ //我的代码没有`else`系列 //模板模式 //@auhtor TIGERB //------------------...//------------------------------------------------------------ //我的代码没有`else`系列 //模板模式 //@auhtor TIGERB...我的代码没有`else`,只是一个在代码合理设计的情况下自然而然无限接近或者达到的结果,并不是一个硬性的目标,务必较真。 2.

    1K30

    代码组件 | 我的代码没有else

    嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 ? 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套我总结的使用设计模式的四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 按照如上某东的订单结算页面的示例,我们得到了如下的订单结算页面模块组成图: ?...----------------------- //我的代码没有`else`系列 //组合模式 //@auhtor TIGERB //-------...我的代码没有`else`,只是一个在代码合理设计的情况下自然而然无限接近或者达到的结果,并不是一个硬性的目标,务必较真。 2....---- 我的代码没有else系列 更多文章 代码模板 | 我的代码没有else 链式调用 | 我的代码没有else 点击https://github.com/TIGERB/easy-tips/tree

    1.2K10

    Java基准测试工具JMH使用

    大家好,又见面了,我是你们的朋友全栈君。 JMH,即Java Microbenchmark Harness,这是专门用于进行代码的微基准测试的一套工具API。...to Chart的转化方法从而支持更多的图表 JMH Visualizer:它是一个功能齐全的可视化项目,只是少了我想要的图表罢了。...比如 JIT 优化中的死码消除,比如以下代码:@Benchmark public void testStringAdd(Blackhole blackhole) { String a = “”;...for (int i = 0; i < length; i++) { a += i; } }JVM 可能会认为变量 a 从来没有使用过,从而进行优化把整个方法内部代码移除掉,这就会影响测试结果...JMH 提供了两种方式避免这种问题,一种是将这个变量作为方法返回值 return a,一种是通过 Blackhole 的 consume 来避免 JIT 的优化消除。

    55910

    基准测试神器JMH —— 详解36个官方例子

    为什么需要 有人可能会说,我可以在代码的前后打点计算代码运行时间,为什么还需要JMH?...本例主要介绍了一个知识点:Dead-Code Elimination (DCE) ,即死码消除,文档上说编译器非常聪明,有的代码没啥用,就在编译器被消除了,但这给我做基准测试带了一些麻烦,比如上面的代码中...,baseline 和 measureWrong 有着相同的性能,因为编译器觉得 measureWrong这段代码执行后没有任何影响,为了效率,就直接消除掉这段代码,但是如果加上return语句,就不会在编译期被去掉...(9)JMHSample09Blackholes 本例是为了解决(8)中死码消除问题,JMH提供了一个 Blackholes (黑洞),这样写就不会被编译器消除了。 ?...(21)JMHSample21ConsumeCPU 本例介绍了Blackhole的另一种用法,前面提到的Blackhole可以用来干掉“死码消除”,同时Blackhole也可以“吞噬”cpu时间片(怪不得起这个名字

    2.7K22

    为什么我的HibernateDaoSupport没有注入SessionFactory

    前言 很早之前,就打算写这一篇文章了(其实有很多源码分析的文章打算写,但是自己太拖延了导致很多文章搁浅了)。我为什么要写这一文章呢?...事情的缘由是同事在SpringBoot项目中有一个A类继承HibernateDaoSupport,但是程序运行总是抛出没有成功注入SessionFactory的错误,后来我debug Spring源码解决了这个问题...这个错误的原因是A类的RootBeanDefinition中的autowireMode的值为0,在AbstractAutowireCapableBeanFactory类中的populateBean方法中没有执行到...autowireByName(beanName, mbd, bw, newPvs),导致SessionFactory的属性没有注入成功。...beanFactory)方法中不要使用beanFactory.getBean()会造成类性早熟,最终的后果就是类中的一些属性没有成功注入。

    3.1K10

    链式调用 | 我的代码没有else

    嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 ? 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套我总结的使用设计模式的四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 步骤 逻辑 1 参数校验 2 获取地址信息 3 地址信息校验 4 获取购物车数据 5...代码demo package main //--------------- //我的代码没有`else`系列 //责任链模式 //@auhtor TIGERB我的代码没有`else`,只是一个在代码合理设计的情况下自然而然无限接近或者达到的结果,并不是一个硬性的目标,务必较真。 2....---- 我的代码没有else系列 更多文章 代码模板 | 我的代码没有else 点击https://github.com/TIGERB/easy-tips/tree/master/go/src/patterns

    1.7K40

    订阅通知 | 我的代码没有else

    嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 ? 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套我总结的使用设计模式的四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 注:本文于单体架构背景探讨业务的实现过程,简单容易理解。...代码demo package main //------------------------------------------------------------ //我的代码没有`else`系列...我的代码没有`else`,只是一个在代码合理设计的情况下自然而然无限接近或者达到的结果,并不是一个硬性的目标,务必较真。 2....---- 我的代码没有else系列 更多文章 代码模板 | 我的代码没有else 链式调用 | 我的代码没有else 代码组件 | 我的代码没有else 点击https://github.com/

    1.8K20

    客户决策 | 我的代码没有else

    嗯,我的代码没有else系列,一个设计模式业务真实使用的golang系列。 ? 前言 本系列主要分享,如何在我们的真实业务场景中使用设计模式。...关于怎么用,完全可以生搬硬套我总结的使用设计模式的四个步骤: 业务梳理 业务流程图 代码建模 代码demo 业务梳理 我们以某团的订单支付页面为例,页面上的每一个支付选项都是一个支付策略。...------------ //我的代码没有`else`系列 //策略模式 //@auhtor TIGERB //------------------...我的代码没有`else`,只是一个在代码合理设计的情况下自然而然无限接近或者达到的结果,并不是一个硬性的目标,务必较真。 2....---- 我的代码没有else系列 更多文章 代码模板 | 我的代码没有else 链式调用 | 我的代码没有else 代码组件 | 我的代码没有else 订阅通知 | 我的代码没有else

    91920

    聊聊springboot项目如何利用jmh来进行基准测试

    预热,可用于类或者方法上由于JVM会使用JIT对热点代码进行编译,因此同一份代码可能由于执行次数的增加而导致执行时间差异太大,因此我们可以让代码先预热几轮,预热时间不算入测量计时。...@Setup: 用于基准测试前的初始化动作,只能用于方法@TearDown 用于基准测试后执行,主要用于资源的回收,只能用于方法4、JMH陷阱常见的比如死码消除。...所谓的死码,是指注释的代码,不可达的代码块,可达但不被使用的代码等等。...因此,JVM可以完全取消a+b的计算。它被认为是死代码。JVM然后可以检测到sum变量从未被使用,并且随后a和b也从未被使用。他们也可以被淘汰。...consume 来避免 JIT 的优化消除。

    18910

    JMH简介

    大家好,又见面了,我是你们的朋友全栈君。   JMH是新的microbenchmark(微基准测试)框架(2013年首次发布)。...与其他众多框架相比它的特色优势在于,它是由Oracle实现JIT的相同人员开发的。特别是我想提一下Aleksey Shipilev和他优秀的博客文章。...) 冗余代码 冗余代码消除是microbenchmark中众所周知的问题。...通常的解决方法是以某种方式使用计算结果。JMH本身不会实施对冗余代码的消除。但是如果你想消除冗余代码——要做到测试程序返回值不为void。永远返回你的计算结果。JMH将完成剩余的工作。...JIT非常聪明,在循环中经常出现不可预料的处理。要测试真实的计算,让JMH处理剩余的部分。

    1.7K20

    JIT中的LogCompilation

    简介 我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能。那么JIT什么时候开始编译的,又是怎么编译的,作为一个高傲的程序员,有没有办法去探究JIT编译的秘密呢?...根据上面的介绍,我们现场来生成一个JIT的编译日志,为了体现出专业性,这里我们需要使用到JMH来做性能测试。...之前有的朋友说,代码也用图片,看起来好看,从本文之后,我们会尽量把代码也转成图片来展示: ? 看完我的JMH的介绍,上面的例子应该很清楚了,主要就是做一个累加操作,然后warmup 5轮,测试5轮。...在@Fork注解里面,我们可以配置jvm的参数,为什么我注释掉了呢?因为我发现在jvmArgsPrepend中的-XX:LogFile是不生效的。 没办法,我只好在运行配置中添加: ?...总结 复杂的编译日志终于讲完了,可能讲的并不是很全,还有一些其他情况这里并没有列出来,后面如果遇到了,我再添加进去。

    88431

    不要再用main方法测试代码性能了,用这款JDK自带工具

    预热主要让JVM对被测代码进行足够多的优化,比如JIT编译器的优化。...这是因为JIT编译器进行了优化,比如当JVM发现在测试当中StringBuffer并没有发生逃逸,于是就进行了锁消除操作。 常用注解 下面对JHM当中常用的注解进行说明,以便大家可以更精确的使用。...对于每个@Benchmark方法使用一个独立的进程可以解决这个问题,这也是JMH的默认选项。注意不要设置为0,设置为n则会启动n个进程执行测试(似乎也没有太大意义)。...注意事项 无用代码消除(Dead Code Elimination) 现代编译器是十分聪明的,它们会对代码进行推导分析,判定哪些代码是无用的然后进行去除,这种行为对微基准测试是致命的,它会使你无法准确测试出你的方法性能...JMH提供了两种方式避免这种问题,一种是将这个变量作为方法返回值return a,一种是通过Blackhole的consume来避免JIT 的优化消除。

    45310
    领券