jdk没有对可以移位操作的乘除做优化
来源:互联网 发布:java 生成文件 编辑:程序博客网 时间:2024/06/11 22:50
一个数左移几,相当于乘以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里运行的,是如何运行的呢?有没有做优化呢?
- jdk没有对可以移位操作的乘除做优化
- 移位实现常量乘除的简单优化
- 移位运算-2高效的乘除运算
- 移位与乘除关系
- 移位操作对CPSR的影响
- C#对Excel的操作(可以做报表导出的组件)
- 网页为搜索引擎可以做的优化
- Java的移位操作
- 移位操作的妙用
- Java的移位操作
- 移位操作的优先级
- 集合的移位操作
- Java的移位操作
- 《没有任何接口》读书笔记_20041012:可以做的更好
- android framework 没有什么可以做的为
- make: 没有什么可以做的为 `all'。
- 从汇编代码的角度观察switch与if...else,以及乘除与移位的性能差别。
- 今天做的一道题目,没有优化,超时限了
- JavaScript如何处理事件
- Jetty 源代码分析之线程池
- Ubuntu apt-get 详解
- static详解1
- ARM9(S3C2440)时钟与定时器
- jdk没有对可以移位操作的乘除做优化
- 解析器模式
- 测试文档写作-测试报告(上)
- struts2 Could not find action or result
- HDU 3496 Watch The Movie (二维背包)
- iOS开发获取SDK下私有API
- ARM9(S3C2440) UART
- hdu1069
- 如何让你开发的游戏赚钱