2016-07-18 141 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原语。