2016-07-18 93 views
0

我正在使用Java實現分佈式鍵值存儲。我需要爲每個鍵保存一個時間戳。由於我想在系統中擁有大量的密鑰,因此我決定使用BigInteger而不是long,但我擔心它的效率。BigInteger效率比較長嗎?

請注意,我沒有任何乘法,我只使用additioncomparTo。 那麼,您認爲BigInteger的效率明顯低於long嗎?

這是我第一次嘗試BigInteger,還有沒有其他的問題比較long

+2

什麼樣的效率?速度還是記憶還是兩者?您是否在實際應用中測試了BigInteger vs. long? – Nayuki

+3

您認爲您認爲'2^64'不夠多少個鍵? – apangin

+1

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

回答

1

No. BigInteger需要比long更多的內存,並且因爲它不是原始類型,所以它也比較慢。我只會在需要更多數字而不是長時間提供的時候使用它。據我所知,爲了您的目的,long應該是足夠的(並且更有效率)。

1

Instant

如果你想有一個時間戳,我們已經有一個類爲:Instant表示UTC,分辨率高達nanoseconds在時間軸上一會兒。

在Java 8中,當前時刻以高達毫秒的分辨率捕獲。在Java 9中,Clock的一個新實現捕獲當前時刻,直到達到全納秒分辨率,這取決於您的計算機時鐘硬件。

UUID

但是,如果你想確定對象在分佈式系統中,使用發明了只需爲此類型:Universally Unique Identifier (UUID)。這種類型在官方標準中定義。由128位值組成,基本上是一個難以想象的大數目,但某些位有一定的含義。

對於人類閱讀,以規範格式生成十六進制字符串。

Java包括一個UUID類來表示這樣的值。我記得在OpenJDK實現中內部存儲爲一對64位long數字。

BigInteger>long

並回答你的問題直接,BigInteger旨在表示極大的相數,不適合效率。原始數據(64位數字)使用的內存少得多,因爲它缺少對象的類別開銷以及用於表示和操作可能比適合CPU寄存器大得多的巨大數字的機制。並且在long上的操作執行得更快。

因此,當您不需要BigInteger的功能時,堅持使用long原語。