2013-10-04 103 views
0

當使用IEEE754浮點數時,我發現了兩種方法來清零32位變量的前9位。他們中的任何一個都比另一個好嗎?位掩碼vs移位(+ java字節碼)

Java相關的補充:有沒有提供關於指令效率的信息的列表?我已經隨機發現BIPUSH通常應該比LDC更快,但沒有其他任何東西。

// 10111111110010100011110101110001 bits 
// 00000000010010100011110101110001 significand 

int bits = 0b10111111110010100011110101110001; 
int significand = bits & 0b11111111111111111111111; 
int significand2 = bits <<9>>> 9; 

字節碼...

L4 
    LINENUMBER 49 L4 
    ILOAD 0 
    LDC 8388607 // = 0b11111111111111111111111 
    IAND 
    ISTORE 5 
L5 
    LINENUMBER 50 L5 
    ILOAD 0 
    BIPUSH 9 
    ISHL 
    BIPUSH 9 
    IUSHR 
    ISTORE 6 

感謝。 :)

+1

簡單的整數算術運算在現代處理器上成爲一個重要的性能問題是非常罕見的。有條件的分支和緩存未命中更有可能重要。 –

回答

3

Bytecode是一種可移植的中間語言。爲了獲得良好的性能,現代JVM將其編譯爲本地代碼,因此不要過多地讀取它:CPU實際執行的內容可能會非常不同。您將不得不分析生成的本地代碼,以便能夠得出關於X爲什麼比Y更好的結論。

如何獲取生成的彙編程序代碼的打印輸出取決於JVM,請參閱此處瞭解有關熱點(即Oracle JDK和OpenJDK):http://mechanical-sympathy.blogspot.com/2013/06/printing-generated-assembly-code-from.html

0

通常,移位操作應該更快。這裏有一個簡單的Java測試結果值:

int bits = 0b10111111110010100011110101110001; 

long time = System.nanoTime(); 
int significand; 
for (int i = 0; i < 1000000000; i++) { 
    significand = bits & 0b11111111111111111111111; 
} 
System.out.println(String.format("Time: %f (ms)", 
    (System.nanoTime() - time)/1000000f)); 

long time2 = System.nanoTime(); 
for (int i = 0; i < 1000000000; i++) { 
    significand = bits <<9>>> 9; 
} 
System.out.println(String.format("Time 2: %f (ms)", 
    (System.nanoTime() - time2)/1000000f)); 

時間1:7.003190(MS)
時間2:2.633435(MS)

這些,當然,對於重複的數量巨大成果。

+0

我已經描述了我的代碼(JProfiler),並且shinfting方法確實似乎更快(1.56x),但是我正在尋找更爲一般的答案,或者至少提示我在Joni的答案中找到哪些地方。無論如何非常感謝。 :) –