この記事の次の行を読んだので、コンピューターのアーキテクチャでどのようInterlocked.Increment
に動作するかをテストしていました。lock
Interlocked.Increment で書き直されたように、少なくとも一部のアーキテクチャでは、メソッドはより高速に実行されるはずです。
次のコードを使用して、自分のプロジェクトでロックを確認する価値があると確信しました。
var watch = new Stopwatch();
var locker = new object();
int counter = 0;
watch.Start();
for (int i = 0; i < 100000000; i++)
{
lock (locker)
{
counter++;
}
}
watch.Stop();
Console.WriteLine(watch.Elapsed.TotalSeconds);
watch.Reset();
counter = 0;
watch.Start();
for (int i = 0; i < 100000000; i++)
{
Interlocked.Increment(ref counter);
}
watch.Stop();
Console.WriteLine(watch.Elapsed.TotalSeconds);
おおよその値がロッキングで 2.4 秒、インターロックで 1.2 秒という安定した結果が得られています。しかし、このコードをリリース モードで実行すると、Interlocked の値のみが約 0.7 秒に改善され、ロック時間は同じままであることを発見して驚きました。何故ですか?ロックが解除されていないリリース モードの場合、Interlocked はどのように最適化されますか?