我正在使用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