1

私は通常の操作の一部として大量の小さなオブジェクトを作成するC#ライブラリに取り組んでいます(コンパイラのASTノードを考えてください)。パフォーマンスを妨げない方法で、各インスタンスに一意の識別子(プログラム内で一意であり、グローバルに一意ではない)を割り当てたいと思います。オブジェクトは不変であり、スレッド間で共有できるため、IDはスレッド間で一意である必要があります。

これが私が検討しているいくつかのオプションです:

  1. static intまたはlongを使用し、次の呼び出しを介して新しいIDを取得します。Interlocked.Increment()
  2. Guid.NewGuid()IDの生成に使用
  3. 属性でstaticintまたはlongフィールドを使用して[ThreadStatic]から、現在のスレッドのプロパティから文字列IDを作成しManagedThreadId、スレッドローカルカウンターから次の値を作成します。

これらの1つは、他よりもパフォーマンスが高くなりますか?これを行うためのより良い方法はありますか?

ありがとう!

編集:
私は簡単なベンチマークを実行し、次の結果を得ました:

  1. 0.19秒(intとlongは基本的に同じでした)
  2. 1.1秒
  3. 3.5秒

これは、を使用することを強く示しているようInterlockedです。Interlockedただし、マルチスレッドシナリオで速度が低下するリスクはありますか?

4

1 に答える 1

2

Interlocked.Increment++への呼び出しがアトミック操作として確実に行われるようにすることで機能します。これは、別のスレッドが中間変数を取得する方法がないことを意味します++

唯一のパフォーマンスの問題は、変数が格納されているメモリを同期する必要があることです。テストで示されているように、このパフォーマンス コストは無視できることに注意してください。

于 2013-02-23T19:41:14.803 に答える