怎么优化
没必要,纯属工作不饱和或者瞎折腾
针对第一点,今天本文会给出详细的答案;针对第二点,大家说的也没错,这种优化,你不管系统基本照样运行,但是,作为程序员,拿追剧、刷视频的时间来折腾一些技术,我是很喜欢的,喜欢和这种细节battle,不弄明白吃饭也不香。很多时候,我们要具有瞎折腾的勇气和好奇心,尤其是在当下这种浮躁的环境下;当然,这都是本文的题外话,扯远了。
OK,我们言归正传。为什么三目运算符中包装类型和基本类型共存时会影响性能呢?比如:
IntegerbrandId=Objects.isNull(content.getBrandId())?0:content.getBrandId();
首先影响性能是肯定的(性能优化不是银弹,高并发场景下我们需要方方面面的优化)。要知道上述代码为什么会影响性能就要从java代码的执行原理来说了,大家应该都知道我们写的.java文件要想被执行,需要经过加载-链接-初始化,然后JVM才会执行对应的代码,JVM拿到class文件即字节码文件去执行对应的指令。如下图:
JVM加载流程所以对于上图中的代码,即如下代码:
for(StrategyContentDOcontent:saveRequestDTO.getStrategyContentList()){
IntegercategoryId=content.getCategoryId();
IntegerbrandId=Objects.isNull(content.getBrandId())?0:content.getBrandId();
doCheck4Busi(uniqueChecker,content,categoryId,brandId);
}
我们需要拿到它的字节码对应的JVM执行指令,一看便知。你可以通过javac命令编译Java文件为字节码文件,即javacxxx.java,因为字节码文件我们人类看不懂,所以你可以再用javap命令将字节码文件反汇编为JVM的执行指令,这个执行指令我们是可以阅读的,即javap-cxxx。上述获取执行指令的过程觉得麻烦,这里推荐idea中的一个插件:jclasslibBytecodeViewer(文末有使用说明,很简单很方便)。这里我贴出相关代码的执行指令,我们一起看下:
没有优化时的代码对应的JVM执行指令:
......省略一些无关指令
aload6
invokevirtual#25