我正在测试我的计算机体系结构的方式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 秒,并且锁定时间保持不变。这是为什么?在没有锁的释放模式下如何优化互锁?