java 乘法 位移_java 位移运算与乘法运算
對于
JAVA
編程中,適當的采用位移運算,會減少代碼的運行時間,提高項目的運行效率。這個可以從一道面試題說起:
問題:
用最有效率的方法算出2
乘以8
等於幾?”
答案:2 << 3
由此就引發了我的思考,為什么位移運算會比乘法運算更快呢?其實簡單的想想,計算機的內存是用由
0
和
1
組成的二進制數據形式來表示數據的,對于乘法運算,我想內部應該還會轉化成位移運算。
下面用一個例子來驗證上面的正確性。
例子:
public class Demo2 {
public static void main(String[] args){
Demo2 d = new Demo2();
d.method1();
d.method2();
}
public void method1(){
long start = System.nanoTime();
int i = 100;
int j = i*2;
System.out.println("乘法運算耗時:"+(System.nanoTime()-start));
}
public void method2(){
long start = System.nanoTime();
int i = 100;
int j = i<<1;
System.out.println("位移運算耗時:"+(System.nanoTime()-start));
}
}
輸出:
乘法運算耗時
:46114
(單位納秒)
位移運算耗時
:8016
(單位納秒)
同時我簡化上面的代碼:
public class Demo2 {
public void method1(){
int i = 100;
int j = i*2;
}
public void method2(){
int i = 100;
int j = i<<1;
}
}
E:\>javac
Demo2.java
E:\>javap
-verbose Demo2 >> Demo.txt
查詢字節碼信息:
……
public void method1();
Code:
Stack=2, Locals=3, Args_size=1
0:bipush100
2:istore_1
3:iload_1
4:iconst_2
5:imul
6:istore_2
7:return
LineNumberTable:
line 7: 0
line 8: 3
line 9: 7
public void method2();
Code:
Stack=2, Locals=3, Args_size=1
0:bipush100
2:istore_1
3:iload_1
4:iconst_1
5:ishl
6:istore_2
7:return
LineNumberTable:
line 12: 0
line 13: 3
line 14: 7
}
從區別來看,位移運算調的是
ishl
(將
int
型數值左移位指定位數并將結果壓入棧頂)指令,乘法運算調的是
imul
(將棧頂兩
int
型數值相乘并將結果壓入棧頂)指令。
整數乘法或整數除法所需要的時鐘周期遠遠大于移位操作所需的時鐘周期,下面列出這個指令的基本執行時間:
移位指令
寄存器移
1
位
時鐘周期數為
2
整數乘法
IMUL
16
位寄存器乘
時鐘周期為
128 ~ 154
整數除法
IDIV
16
位寄存器
時鐘周期為
165 ~ 184
如果再要深究為什么,就要研究寄存器和電路圖了的知識了
…
點到為止
..
參考資料:
http://www.programfan.com/blog/article.asp?id=32217
http://blog..net/kypfos/article/details/810151
http://budairenqin.iteye.com/blog/1565750
總結
以上是生活随笔為你收集整理的java 乘法 位移_java 位移运算与乘法运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交换排序 java_java实现交换排序
- 下一篇: mysql 平均月份_Mysql按月份统