我在Java中实现了一个分布式键值存储。我需要为每个密钥保存一个时间戳。由于我希望系统中有大量的密钥,因此我决定使用BigInteger
而不是long
,但我担心它的效率。
请注意,我没有任何乘法,我只使用addition
和comparTo
。
那么您认为BigInteger
的效率明显低于long
吗?
这是我第一次尝试BigInteger
,与long
相比还有其他问题吗?
答案 0 :(得分:2)
没有。 BigInteger
需要比long
更多的内存,并且因为它不是原始类型,所以它也更慢。我只会在你需要更多数字而不是长期提供的数字时使用它。
就我的目的而言,long
应该足够(并且效率更高),据我所知。
答案 1 :(得分:1)
Instant
如果您需要时间戳,我们已经有了一个类:Instant
代表UTC中时间轴上的一个时刻,其分辨率最高为nanoseconds。
在Java 8中,当前时刻以高达毫秒的分辨率捕获。在Java 9中,Clock
的新实现将当前时刻捕获到完整的纳秒分辨率,具体取决于您的计算机时钟硬件。
但是,如果要在分布式系统中识别对象,请使用为此目的而发明的类型:Universally Unique Identifier (UUID)。此类型在官方标准中定义。由128位值组成,基本上是一个难以想象的大数字,但某些位具有一定的含义。
对于人类阅读,以规范格式生成十六进制字符串。
Java包含一个UUID
类来表示这些值。我记得在OpenJDK实现中内部存储为一对64位long
数字。
BigInteger
> long
为了回答您的直接问题,BigInteger
旨在代表巨大的数字,而非为效率而设计。 long
原语(64位数)使用的内存要少得多,因为它缺少类的开销。对象和用于表示和操作可能大于CPU寄存器的巨大数字的机器。 long
上的操作执行得更快。
因此,当您不需要BigInteger
的功能时,请坚持使用long
原语。