我正在測試Interlocked.Increment
和lock
如何在我的計算機架構上運行,因爲我在this article中讀取了以下行。Interlocked.Increment與鎖定在調試與發佈模式
正如使用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.4S用於鎖定和1.2S的互鎖。然而,我驚訝地發現,在釋放模式下運行此代碼僅提高了聯鎖的值,大約爲0.7s並且鎖定時間保持不變。這是爲什麼?在鎖定不是鎖定的釋放模式下,互鎖是如何優化的?
通常,所有性能測量都應該只在發佈模式下完成。調試模式性能測量不相關。讀取由C#編譯器提供的MSIL,可能代碼太優化了(例如,Interlocked被++替換)。 –
無鎖區域需要兩條互鎖指令。您測量的數字完美地顯示了這一點,至少在調試模式下。順便說一句,你的基準測試意味着很少,因爲同步成本取決於鎖定和緩存行爭用。你的基準假設沒有。 – usr
@usr如果你能寫更多關於它並將其作爲答案發布,那將是非常好的。我不明白MSIL,因爲我建議閱讀整篇文章,但我仍然不完全理解,因此有關該主題的更多信息將受到歡迎。 –