2016-10-01 77 views
0

這兩個函數都將Long轉換爲二進制字符串,但比另一個更優化?我查看了Long類的源代碼,這兩個靜態方法有不同的實現。Long.toBinaryString()和Long.toString(num,2)之間的區別?

+0

如果'toBinaryString'沒有爲任務優化,我會感到震驚。 – 4castle

+0

toString使用餘數和除法操作來構建數字,但toBinaryString使用右移。但我不確定編譯器是否優化了除法和除法2的除法。所以我無法確定是否會有任何重大差異。如果編譯器優化已到位,那麼我期望它們非常相似。只是我的想法,不知道如果這是真的。 –

+1

從一個快速的基準測試(仍然不符合JMH/JIT分析,但是堅持一些Microbenchmarking實踐),似乎轉換的核​​心循環(將數字寫入一個「char」緩衝區)可能只有〜25%通用的'toString'方法更慢。 **但是**相當大的額外開銷可能源於'toString'方法中'char'數組的相關部分在創建字符串時必須*被複制*的事實。在'toBinaryString'中,所需字符的數量直接計算*,並將得到的'char'數組傳遞給字符串*而不復制它。 – Marco13

回答

0

答案很容易得到,只是做了一個試驗:

class Test { 
    public static void main (String args[]) { 
    long millisStart = System.currentTimeMillis(); 
    for(int i = 0; i < 1000000; i++) { 
     String s = Long.toBinaryString(i/10000); 
    } 
    System.out.println(System.currentTimeMillis() - millisStart); 

    millisStart = System.currentTimeMillis(); 
    for(int i = 0; i < 1000000; i++) { 
     String st = Long.toString(i/10000, 2); 
    } 
    System.out.println(System.currentTimeMillis() - millisStart); 
    } 
} 

在我測試這對(樹莓派)的系統,這將導致655對3279.

,我就猜測這個Long.toString(num,2);速度較慢。這並不奇怪,因爲它必須靈活。

+0

(我不是downvoter,但)雖然*適當的*基準可能會得出類似的結論,但給定形式的基準在任何方面都不可靠。 – Marco13

+0

並不意味着是一個適當的基準。然而,當涉及到差異的幅度時,再加上對某些功能的專業化,它仍然給出了一個明確的答案:「是否比另一個更優化?」。 –

+0

感謝您的測試Florian。我更期待看看是否有人可以查看源代碼並解釋爲什麼toBinaryString更優化,假設它是。 (我不是downtwoter順便說一句) – user2603017