搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 占小狼的博客 > 在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!

在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!

占小狼的博客 2019-02-07
举报


在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!

在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!

在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!

在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!


东哥说这段代码来自于 Stackoverflow,真正去逛这个网站的同学还是很少),如下。


public static void main(String[] args) {
long startTime = System.nanoTime();
   int
n = 0;
   for
(int i = 0; i < 1000000000; i++) {
n += 2 * i * i;
   
}
System.out.println((double) (System.nanoTime() - startTime) / 1000000000 + " s");
   
System.out.println("n = " + n);
}


代码很简单吧,它的执行时间大概在 0.60s ~ 0.65s。但是如果你把 2*i*i 替换成 2*(i*i),执行时间大概在 0.50s ~ 0.55s。


对这段程序的两个版本分别执行 15 次,得到的结果如下。


在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!


我们可以看出 2*(i*i) 比 2*i*i 快 。


在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!

我们来分别查看它的字节码,这里东哥给我推荐了一款好用的 IDEA 插件,叫做 jclasslib bytecode viewer。


 2*i*i 的字节码如下。


在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!


2*(i*i) 的字节码如下。


在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!


我们可以发现除了字节码顺序不同外,没有其它异常,下一步该怎么办呢?


在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!



这里东哥给我推荐一款开源的工具,叫做 jitwatch,它可以查看查看分析HotSpot JIT compiler 生成的汇编代码,关于它的安装方法可以通过谷歌查阅。


查看是否安装成功?可以用下面的命令。


在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!


如何查看汇编代码?


运行时,添加参数 -XX:+PrintAssembly。


好了,那我们来分别看看它们的汇编代码,由于汇编代码很多,我这里就不贴出来了,各位同学可以去运行分析一下。


我这里就说一下结论,通过对比分析,我们会发现,2*i*i 进行了大量的堆栈操作,因此,需要保存大量的中间结果;而 2*(i*i) 只有少量的堆栈操作。


显而易见,2*(i*i) 比 2*i*i 快是由于 JIT 优化的结果。



号外:最近整理了一下以前编写的一系列 java面试、java并发、netty源码解析、jvm基础、源码解析以及gc问题实战文章。关注并回复:000,快来领取吧~!!!

-END-

 近期热文:






版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《在Java运算中,2*(i*i) 居然比 2*i*i 跑得快!》的版权归原作者「占小狼的博客」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

举报