從 NET 4 開始,我可以使用ManualResetEventSlim在阻塞之前稍微旋轉的類,以便在阻塞時間很短的情況下獲得時間優化(我沒有背景關系切換)。
我想使用基準來衡量這次的時間有多少,以便或多或少地知道更喜歡使用 aManualResetEventSlim而不是 classic所需的等待時間ManualResetEvent。
我知道這個度量是依賴于 CPU 的,不可能先驗地知道旋轉時間,但我想要一個數量級。
我撰寫了一個基準類,以獲得ManualResetEventSlim比ManualResetEvent.
public class ManualResetEventTest
{
[Params(0, 1, 10)]
public int MillisecondsSleep;
[Benchmark]
public void ManualResetEventSlim()
{
using var mres = new ManualResetEventSlim(false);
var t = Task.Run(() =>
{
mres.Wait();
});
Thread.Sleep(MillisecondsSleep);
mres.Set();
t.Wait();
}
[Benchmark]
public void ManualResetEvent()
{
using var mres = new ManualResetEvent(false);
var t = Task.Run(() =>
{
mres.WaitOne();
});
Thread.Sleep(MillisecondsSleep);
mres.Set();
t.Wait();
}
}
結果如下

如您所見,我發現僅使用 Thread.Sleep(0) 可以提高性能。此外,我看到 1 毫秒和 10 毫秒的平均時間為 15 毫秒。我錯過了什么嗎?
真的只有等待 0 毫秒才能更好地使用 aManualResetEventSlim而不是ManualResetEvent嗎?
uj5u.com熱心網友回復:
摘自 Nutshell 書中出色的 C# 9.0:
等待或發出信號
AutoResetEvent或ManualResetEvent大約需要一微秒(假設沒有阻塞)。
ManualResetEventSlim由于它們不依賴作業系統并且CountdownEvent明智地使用旋轉結構,因此在短等待場景中速度可以提高 50 倍。然而,在大多數情況下,信令類本身的開銷不會造成瓶頸。因此,很少考慮。
希望這足以給你一個粗略的數量級。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444728.html
