一个数左移几,相当于乘以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里运行的,是如何运行的呢?有没有做优化呢?