BigInteger与长期相比是否有效?

时间:2016-07-18 01:40:43

标签: java performance biginteger

我在Java中实现了一个分布式键值存储。我需要为每个密钥保存一个时间戳。由于我希望系统中有大量的密钥,因此我决定使用BigInteger而不是long,但我担心它的效率。

请注意,我没有任何乘法,我只使用additioncomparTo。 那么您认为BigInteger的效率明显低于long吗?

这是我第一次尝试BigInteger,与long相比还有其他问题吗?

2 个答案:

答案 0 :(得分:2)

没有。 BigInteger需要比long更多的内存,并且因为它不是原始类型,所以它也更慢。我只会在你需要更多数字而不是长期提供的数字时使用它。

就我的目的而言,long应该足够(并且效率更高),据我所知。

答案 1 :(得分:1)

Instant

如果您需要时间戳,我们已经有了一个类:Instant代表UTC中时间轴上的一个时刻,其分辨率最高为nanoseconds

在Java 8中,当前时刻以高达毫秒的分辨率捕获。在Java 9中,Clock的新实现将当前时刻捕获到完整的纳秒分辨率,具体取决于您的计算机时钟硬件。

UUID

但是,如果要在分布式系统中识别对象,请使用为此目的而发明的类型:Universally Unique Identifier (UUID)。此类型在官方标准中定义。由128位值组成,基本上是一个难以想象的大数字,但某些位具有一定的含义。

对于人类阅读,以规范格式生成十六进制字符串。

Java包含一个UUID类来表示这些值。我记得在OpenJDK实现中内部存储为一对64位long数字。

BigInteger> long

为了回答您的直接问题,BigInteger旨在代表巨大的数字,而非为效率而设计。 long原语(64位数)使用的内存要少得多,因为它缺少类的开销。对象和用于表示和操作可能大于CPU寄存器的巨大数字的机器。 long上的操作执行得更快。

因此,当您不需要BigInteger的功能时,请坚持使用long原语。