補充上次寫的,C#利用SpinUntil跑迴圈及簡易效能測試

參考:
https://stackoverflow.com/questions/64763173/spinwait-spinuntil-taking-much-longer-than-timeout-to-exit-while-waiting-for-sel

//測試程式碼:
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);

創作者介紹
創作者 GNAySolution 的頭像
Yang

GNAySolution

Yang 發表在 痞客邦 留言(0) 人氣( 0 )