jdk没有对可以移位操作的乘除做优化

尽管左移操作通常比乘法更快,但在Java中,编译器并未对常量乘法表达式如2 << 3进行移位操作的优化,而是转换为乘法。通过字节码分析发现,C++可能对此进行了优化,但JVM层面是否也有类似优化并未明确。
摘要由CSDN通过智能技术生成


一个数左移几,相当于乘以2的几次方,速度比直接用乘法快很多,所以,很多人经常写成:2 << 3,

在java中,这样写真的能提高效率吗?看看java编译后的字节码就知道了。

 

代码:

   int b = 2 * 8;
   System.out.println(b);

用javap -c HelloWorld 查看编译的字节码:

Code:
   0:   bipush  16
   2:   istore_1
   3:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   6:   iload_1
   7:   invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   10:  return

从字节码可以看出,编译器会对在编译阶段就能知道结果的运算做优化(直接使用16,而不是运行的时候再算)。

 

代码:

   int a = 2;
   int b = a << 3;
   System.out.println(b);

字节码:

  Code:
   0:   iconst_2
   1:   istore_1
   2:   iload_1
   3:   iconst_3
   4:   ishl
   5:   istore_2
   6:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   9:   iload_2
   10:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   13:  return

这个不多说,看下面的。

 

代码:

   int a = 2;
   int b = a * 8;
   System.out.println(b);

字节码:

  Code:
   0:   iconst_2
   1:   istore_1
   2:   iload_1
   3:   bipush  8
   5:   imul
   6:   istore_2
   7:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   10:  iload_2
   11:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   14:  return


 从上面可以看出,编译器并没有使用移位操作,而是使用的乘法。说明jdk并没有对这种情况做优化。

 

所以,在java中写成移位操作还是能提高运算速度的。不同的编译器可能实现不同,貌似C++就进行了优化。

 

但值得注意的是,这只是字节码,最终是要在JVM里运行的,是如何运行的呢?有没有做优化呢?

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值