這兩個函數都將Long轉換爲二進制字符串,但比另一個更優化?我查看了Long類的源代碼,這兩個靜態方法有不同的實現。Long.toBinaryString()和Long.toString(num,2)之間的區別?
回答
答案很容易得到,只是做了一個試驗:
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);速度較慢。這並不奇怪,因爲它必須靈活。
(我不是downvoter,但)雖然*適當的*基準可能會得出類似的結論,但給定形式的基準在任何方面都不可靠。 – Marco13
並不意味着是一個適當的基準。然而,當涉及到差異的幅度時,再加上對某些功能的專業化,它仍然給出了一個明確的答案:「是否比另一個更優化?」。 –
感謝您的測試Florian。我更期待看看是否有人可以查看源代碼並解釋爲什麼toBinaryString更優化,假設它是。 (我不是downtwoter順便說一句) – user2603017
- 1. Solr中「Num Docs」和「Max Doc」之間的區別
- 2. while(cin)和while(cin >> num)之間的區別是什麼
- 3. num = + 10和num + = 10有什麼區別?
- 4. [Object,Object]和Array之間的區別(2)
- 5. 要在angularjs中#num,[(ngModel)] =「num」和[value] =「num」之間進行選擇2
- 6. 之間的〜/和的區別../
- 7. '#','%'和'$'之間的區別
- 8. {!!之間的區別!!}和{{}}
- 9. '+ ='和'= +'之間的區別?
- 10. 「。+」和「。+?」之間的區別
- 11. .eq之間的區別。和==
- 12. #。/和#之間的區別。 ./
- 13. !=和!之間的區別==
- 14. 「%〜dp0」和「。\」之間的區別?
- 15. | =和^ = css之間的區別
- 16. 之間的區別。和#
- 17. ==和case之間的區別?
- 18. 「**/* /」和「** /」之間的區別?
- 19. jQuery - '。'之間的區別和「#」
- 20. 「?1」和「?」之間的區別
- 21. `%in%`和`==`之間的區別
- 22. fmod和%之間的區別
- 23. 之間的區別:+和:+
- 24. (eval'(+ 1 2))和(eval(+ 1 2))之間的區別?
- 25. C#中myArray.GetValue(2)和myArray [2]之間的區別是什麼?
- 26. (int *)arr [2]和int * arr [2]之間的區別是什麼?
- 27. SWI-Prolog中duplicate_term/2和copy_term/2之間的區別
- 28. Zend Framework 2和Symfony 2之間的主要區別
- 29. SQL - SPACE(2)+'|'之間的區別+空格(2)和'| 「?
- 30. 批處理編程中%〜2和%2之間的區別?
如果'toBinaryString'沒有爲任務優化,我會感到震驚。 – 4castle
toString使用餘數和除法操作來構建數字,但toBinaryString使用右移。但我不確定編譯器是否優化了除法和除法2的除法。所以我無法確定是否會有任何重大差異。如果編譯器優化已到位,那麼我期望它們非常相似。只是我的想法,不知道如果這是真的。 –
從一個快速的基準測試(仍然不符合JMH/JIT分析,但是堅持一些Microbenchmarking實踐),似乎轉換的核心循環(將數字寫入一個「char」緩衝區)可能只有〜25%通用的'toString'方法更慢。 **但是**相當大的額外開銷可能源於'toString'方法中'char'數組的相關部分在創建字符串時必須*被複制*的事實。在'toBinaryString'中,所需字符的數量直接計算*,並將得到的'char'數組傳遞給字符串*而不復制它。 – Marco13