jdk没有对可以移位操作的乘除做优化
2012-12-27 00:21
197 查看
一个数左移几,相当于乘以2的几次方,速度比直接用乘法快很多,所以,很多人经常写成:2 << 3,
在java中,这样写真的能提高效率吗?看看java编译后的字节码就知道了。
代码:
用javap -c HelloWorld 查看编译的字节码:
从字节码可以看出,编译器会对在编译阶段就能知道结果的运算做优化(直接使用16,而不是运行的时候再算)。
代码:
字节码:
这个不多说,看下面的。
代码:
字节码:
从上面可以看出,编译器并没有使用移位操作,而是使用的乘法。说明jdk并没有对这种情况做优化。
所以,在java中写成移位操作还是能提高运算速度的。不同的编译器可能实现不同,貌似C++就进行了优化。
但值得注意的是,这只是字节码,最终是要在JVM里运行的,是如何运行的呢?有没有做优化呢?
在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安装后没有配置环境变量也可以java -version
- JDBC------>增删改查操作(没有优化)
- 没有终结点在侦听可以接受消息的......这通常是由于不正确的地址或者 SOAP 操作导致的
- 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的
- 没有终结点在侦听可以接受消息的 这通常是由于不正确的地址或者 SOAP 操作导致的
- 检查获得的消息 当某个操作没有得到要求时,可以取消这次消息
- 【java】JDK安装后,没有配置环境变量,也可以java -version查看到版本信息
- 解决centos 安装JDK 后java -version 可以 但是没有 javac && centos 和ubuntu 安装的不同点
- WCF:没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的。
- 客服端调用自定义宿主的WCF报错"没有终结点在侦听可以接受消息的http://localhost:8085/mex。这通常是由于不正确的地址或者 SOAP 操作导致的错误"的解决方案。
- 没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的
- 没有终结点在侦听可以接受消息的 XXXXXX 这通常是由于不正确的地址或者 SOAP 操作导致的
- WCF: 没有终结点在侦听可以接受消息的 这通常是由于不正确的地址或者 SOAP 操作导致的。
- SQL Server 第四堂课,创建存储过程。存储过程是一组编译在单个执行计划中的transact-SQL语句。存储过程相当于C#函数,可以允许模块化程序设计,允许更快执行如果某操作需要大量transct-SQL代码或需要重复执行,将在创建存储过程中对其进行分析和优化。
- 没有终结点在侦听可以接受消息的 http://192.168.1.63:8085/LoginService。这通常是由于不正确的地址或者 SOAP 操作导致的
- 没有终结点在侦听可以接受消息的 http://******/Service.asmx。 这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况, 请参见 InnerExc
- 移位实现常量乘除的简单优化
- Wcf服务引用报错数据包含无法解析的引用:没有终结点在侦听可以接受消息的 这通常是由于不正确的地址或者 SOAP 操作导致的
- GemBox.ExcelLite破解版,可以在没有安装Office的情况,使用.net代码操作Excel文件
- CentOS 删除自带jdk 配置自己的jdk 以及windows下安装 jdk 操作