我在Java中实现了一个分布式键值存储。我需要为每个密钥保存一个时间戳。由于我想在系统中拥有大量的键,我决定使用BigInteger
而不是long
,但我担心它的效率。
请注意,我没有任何乘法,我只使用addition
和comparTo
。所以你认为BigInteger
效率明显低于long
?
这是我第一次尝试BigInteger
,与long
相比还有其他问题吗?
没有.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
旨在代表巨大的数字,而非为效率而设计。 long
原语(64位数)使用的内存要少得多,因为它缺少类和对象的开销以及用于表示和操作可能比容纳在CPU寄存器中的数字大得多的巨大数字的机制。并且long
上的操作执行得更快。
所以,当你不需要BigInteger
的功能时,坚持使用long
原语。