我正在使用Java實現分佈式鍵值存儲。我需要爲每個鍵保存一個時間戳。由於我想在系統中擁有大量的密鑰,因此我決定使用BigInteger
而不是long
,但我擔心它的效率。BigInteger效率比較長嗎?
請注意,我沒有任何乘法,我只使用addition
和comparTo
。 那麼,您認爲BigInteger
的效率明顯低於long
嗎?
這是我第一次嘗試BigInteger
,還有沒有其他的問題比較long
?
我正在使用Java實現分佈式鍵值存儲。我需要爲每個鍵保存一個時間戳。由於我想在系統中擁有大量的密鑰,因此我決定使用BigInteger
而不是long
,但我擔心它的效率。BigInteger效率比較長嗎?
請注意,我沒有任何乘法,我只使用addition
和comparTo
。 那麼,您認爲BigInteger
的效率明顯低於long
嗎?
這是我第一次嘗試BigInteger
,還有沒有其他的問題比較long
?
No. BigInteger
需要比long
更多的內存,並且因爲它不是原始類型,所以它也比較慢。我只會在需要更多數字而不是長時間提供的時候使用它。據我所知,爲了您的目的,long
應該是足夠的(並且更有效率)。
Instant
如果你想有一個時間戳,我們已經有一個類爲:Instant
表示UTC,分辨率高達nanoseconds在時間軸上一會兒。
在Java 8中,當前時刻以高達毫秒的分辨率捕獲。在Java 9中,Clock
的一個新實現捕獲當前時刻,直到達到全納秒分辨率,這取決於您的計算機時鐘硬件。
但是,如果你想確定對象在分佈式系統中,使用發明了只需爲此類型:Universally Unique Identifier (UUID)。這種類型在官方標準中定義。由128位值組成,基本上是一個難以想象的大數目,但某些位有一定的含義。
對於人類閱讀,以規範格式生成十六進制字符串。
Java包括一個UUID
類來表示這樣的值。我記得在OpenJDK實現中內部存儲爲一對64位long
數字。
BigInteger
>long
並回答你的問題直接,BigInteger
旨在表示極大的相數,不適合效率。原始數據(64位數字)使用的內存少得多,因爲它缺少對象的類別開銷以及用於表示和操作可能比適合CPU寄存器大得多的巨大數字的機制。並且在long
上的操作執行得更快。
因此,當您不需要BigInteger
的功能時,堅持使用long
原語。
什麼樣的效率?速度還是記憶還是兩者?您是否在實際應用中測試了BigInteger vs. long? – Nayuki
您認爲您認爲'2^64'不夠多少個鍵? – apangin
http://stackoverflow.com/questions/31748028/long-vs-biginteger | HTTP://計算器。com/questions/12498363/performance-implications-using-java-biginteger-for-a-huge-bitmask | http://stackoverflow.com/questions/23603513/increasing-javas-biginteger-performance – Yar