专注于Java领域优质技术号,欢迎关注
来自 Java面试那些事儿
![50661da721f4ee4b12cb4f0f9ef4c00d.png](https://i-blog.csdnimg.cn/blog_migrate/a796d85c2dfe423a4d81f4191514461f.jpeg)
![081e4d9ee3927098adb7319158cefd12.png](https://i-blog.csdnimg.cn/blog_migrate/76ae0d700e50b2b711eae67252d1e2db.jpeg)
![30aafd6ca2ebb8f91e394dc6f466addd.png](https://i-blog.csdnimg.cn/blog_migrate/1dfd9bed010185a429f9ad1698ba3924.jpeg)
![bd6d5282b5f3361d17eae3b2b8ef5bb7.png](https://i-blog.csdnimg.cn/blog_migrate/f093d2a44ad65b2c979fe9adcc43b5ad.jpeg)
![794576027eaf21f945263d96394998d4.png](https://i-blog.csdnimg.cn/blog_migrate/534f9e79415b504875c7b291a7d86875.jpeg)
东哥说这段代码来自于 Stackoverflow,真正去逛这个网站的同学还是很少),如下。
![473a539e87125d53a36d5071d0ae60f7.png](https://i-blog.csdnimg.cn/blog_migrate/96e57912f3136e7dbdd0661d8b33db5c.jpeg)
代码很简单吧,它的执行时间大概在 0.60s ~ 0.65s。但是如果你把 2*i*i 替换成 2*(i*i),执行时间大概在 0.50s ~ 0.55s。
对这段程序的两个版本分别执行 15 次,得到的结果如下。
![adce13a92ed8f78bfee0e5b867220be2.png](https://i-blog.csdnimg.cn/blog_migrate/f6768d8126d838d052caa42294936504.jpeg)
我们可以看出 2*(i*i) 比 2*i*i 快 。
![9ebbb1fa9dd33ef41c867305094a5caf.png](https://i-blog.csdnimg.cn/blog_migrate/f9b2c8e1c8b3a9e37309487f0d9f3118.jpeg)
我们来分别查看它的字节码,这里东哥给我推荐了一款好用的 IDEA 插件,叫做 jclasslib bytecode viewer。
2*i*i 的字节码如下。
![c6a249d9b8b065d093a5aea074bf65d1.png](https://i-blog.csdnimg.cn/blog_migrate/1b0a81ca166079cde7bef966e719557a.jpeg)
2*(i*i) 的字节码如下。
![18ee030bece0f2a4cdac6a5992dd0d6e.png](https://i-blog.csdnimg.cn/blog_migrate/711a60dd0188705d15abeaa7004c4966.jpeg)
我们可以发现除了字节码顺序不同外,没有其它异常,下一步该怎么办呢?
![d79ac35055cdd20c017c8d652790a12e.png](https://i-blog.csdnimg.cn/blog_migrate/eddbed25ac38d3e189e9456dddcfa680.jpeg)
这里东哥给我推荐一款开源的工具,叫做 jitwatch,它可以查看查看分析HotSpot JIT compiler 生成的汇编代码,关于它的安装方法可以通过谷歌查阅。
查看是否安装成功?可以用下面的命令。
![fe8f90bba4d7ad6fcd05e2c1520ac410.png](https://i-blog.csdnimg.cn/blog_migrate/ca1ae16841b125b445dc0b317c5ce077.jpeg)
如何查看汇编代码?
运行时,添加参数 -XX:+PrintAssembly。
好了,那我们来分别看看它们的汇编代码,由于汇编代码很多,我这里就不贴出来了,各位同学可以去运行分析一下。
我这里就说一下结论,通过对比分析,我们会发现,2*i*i 进行了大量的堆栈操作,因此,需要保存大量的中间结果;而 2*(i*i) 只有少量的堆栈操作。
显而易见,2*(i*i) 比 2*i*i 快是由于 JIT 优化的结果。
![c41accb13435786151fe69e2f477c039.png](https://i-blog.csdnimg.cn/blog_migrate/364a1970bf541bc787dec54aa9e04be6.jpeg)