私は通常の操作の一部として大量の小さなオブジェクトを作成するC#ライブラリに取り組んでいます(コンパイラのASTノードを考えてください)。パフォーマンスを妨げない方法で、各インスタンスに一意の識別子(プログラム内で一意であり、グローバルに一意ではない)を割り当てたいと思います。オブジェクトは不変であり、スレッド間で共有できるため、IDはスレッド間で一意である必要があります。
これが私が検討しているいくつかのオプションです:
- static intまたはlongを使用し、次の呼び出しを介して新しいIDを取得します。
Interlocked.Increment()
Guid.NewGuid()
IDの生成に使用- 属性でstaticintまたはlongフィールドを使用して
[ThreadStatic]
から、現在のスレッドのプロパティから文字列IDを作成しManagedThreadId
、スレッドローカルカウンターから次の値を作成します。
これらの1つは、他よりもパフォーマンスが高くなりますか?これを行うためのより良い方法はありますか?
ありがとう!
編集:
私は簡単なベンチマークを実行し、次の結果を得ました:
- 0.19秒(intとlongは基本的に同じでした)
- 1.1秒
- 3.5秒
これは、を使用することを強く示しているようInterlocked
です。Interlocked
ただし、マルチスレッドシナリオで速度が低下するリスクはありますか?