2016-07-18 13 views
0

私はJavaで分散キーストアを実装しています。私は各キーのタイムスタンプを保存する必要があります。システムに多数のキーが必要なので、私はlongの代わりにBigIntegerを使用することに決めましたが、私はその効率について懸念しています。BigIntegerは効率的ですか?

私には何も乗算がありません。私はadditioncomparToを使用しました。 BigIntegerlongよりも大幅に効率が悪いと思いますか?

初めてBigIntegerを試していますが、longと比較すると他の懸念事項がありますか?

+2

どのような効率ですか?スピードかメモリーかその両方?実際のアプリケーションでBigIntegerを長い間テストしましたか? – Nayuki

+3

「2^64」で十分ではないと思う鍵はいくつありますか? – apangin

+1

http://stackoverflow.com/questions/31748028/long-vs-biginteger | http:// stackoverflow。com/questions/12498363/performance-implications-of-using-java-biginteger-for-a-huge-bitmask | http://stackoverflow.com/questions/23603513/increasing-javas-biginteger-performance – Yar

答えて

1

No. BigIntegerは、longより多くのメモリを必要とし、プリミティブ型ではないため、処理速度も遅くなります。私はあなたが提供できる長さよりも多くの数字が必要な場合にのみ使用します。

あなたの目的のために、longは、私が知る限り、十分で(より効率的である)必要があります。

1

Instant

あなたはタイムスタンプをしたい場合、我々はすでにそのためのクラスを持っている:Instantnanosecondsまでの分解能でUTCでタイムライン上の瞬間を表しています。

Java 8では、現在の瞬間がミリ秒までの解像度でキャプチャされます。 Java 9では、Clockの新しい実装では、コンピュータのクロックハードウェアに応じて、現在の瞬間を完全なナノ秒の解像度までキャプチャします。

UUID

しかし、あなたは、分散システム間でオブジェクトを識別するだけで、その目的のために発明種類使用したい場合:Universally Unique Identifier (UUID)を。このタイプは、公式の標準で定義されています。 128ビットの値で、基本的には想像もつかないほど大きい数値ですが、特定のビットには一定の意味があります。

人間の読書では、標準形式で16進文字列が生成されます。

Javaには、このような値を表すUUIDクラスが含まれています。私が思い出しているように、OpenJDKの実装では、内部で64ビットの数字のペアとして格納されています(long)。

>long

BigIntegerそして、あなたの直接の問題に答えるためには、BigIntegerは効率のために設計されていないginormous数字を表現するために設計されています。 オブジェクトのオーバーヘッドと、CPUレジスタに収まるよりはるかに大きい可能性のある巨大な数を表現し、操作するための機構がないため、プリミティブ(64ビットの数値)はメモリを大幅に使用しません。 longでの操作は、はるかに高速に実行されます。

BigIntegerの機能が不要な場合は、longプリミティブを使用してください。