他の人が推奨されているように、Interlocked.Increment
はlock()
よりも優れた性能を持っています。 Increment
が "バスロック"ステートメントに変わり、変数が直接増分(x86)または "追加"されて(x64)と表示されるILとアセンブリを見てみましょう。
この "バスロック"ステートメントは、呼び出し元のCPUがその操作を実行している間、別のCPUがバスにアクセスできないようにバスをロックします。さて、C#lock()
ステートメントのILを見てみましょう。ここでは、セクションを開始または終了するためにMonitor
への呼び出しが表示されます。
つまり、.Net lock()
の文は.Net Interlocked.Increment
より多くのことを行っています。
だから、変数をインクリメントするだけなら、Interlock.Increment
の方が高速です。インターロックされたすべてのメソッドを確認して、利用可能なさまざまなアトミック操作を確認し、ニーズに合ったアトミック操作を見つけます。複数の相互関連するインクリメント/デクリメントなどのより複雑な処理を行う場合や、整数より複雑なリソースへのアクセスをシリアライズする場合は、lock()
を使用してください。
出典
2012-11-01 17:20:20
Les
実装の詳細については、コンテキスト – fsimonazzi
-1を追加するためのUpvote。ロックはアトミックなopより遅いですが、これはILとは関係ありません。これらの関数呼び出しは、本来的にILに要求されていないセマンティクスでない場合、アトミックオペレーションよりも高速です。 – Puppy