補充上次寫的,C#利用SpinUntil跑迴圈及簡易效能測試
參考:
//測試程式碼:
const int sleepMSecs = 1000 * 12;
int cnt3 = 0;
bool spinResult = SpinWait.SpinUntil(() =>
{
Thread.Sleep(sleepMSecs);
Console.WriteLine($"{nameof(cnt3)}={cnt3}");
return ++cnt3 < 0;
}, 1000 * 10);
public static bool SpinUntil (Func<bool> condition, int millisecondsTimeout);
初步測試,sleepMSecs <= 1000,SpinUntil會像直覺上理解的,跑10秒後timeout
接著測試sleepMSecs介於1100~12000,condition都是跑10次後觸發timeout,遠超過10秒
使用NET7,跨平臺在Win10/CentOS7測試結果類似
把SpinUntil的英文介紹和原始碼找來看,和Thread.Sleep有很大不同,細節沒看懂,
不像thread和cpu的pipeline,一般會以工廠的生產線做介紹和聯想,SpinUntil看起來有不同的運作機制
SpinUntil中文被譯為切換、空轉、旋轉、自旋...,有看沒有懂
結論,SpinUntil的timeout參數,和直覺上理解的不同
需要有精準的時間離開condition時,應該在condition內自行設計,不使用SpinUntil的timeout參數
public static bool SpinUntil (Func<bool> condition);