High-accuracy, low-jitter microsecond sleep for Windows (WaitableTimer + QPC + Yield). .NET 10+ (Windows).
$ dotnet add package usleep_win_cs高精度・低ジッタな Windows 向け usleep 相当機能を pure C# で提供するライブラリです。
usleep_win_cs は、Windows 上で 実用的な精度と低負荷 の短時間待機を実現するために、
以下を組み合わせたハイブリッド方式を採用しています。
PAUSE / ARM64 YIELD)Sleep(0) / SwitchToThread() / Sleep(1) を併用した公平性重視の待機注: Windows はハードリアルタイム OS ではありません。微小待機の結果は、 電源管理・仮想化・バックグラウンド負荷などの影響を受けます。
WaitableTimer + QPC を優先利用Sleep(0) / SwitchToThread() / Sleep(1) を利用| プロファイル | 説明 |
|---|---|
BALANCED(既定) | 低ジッタと公平性のバランス |
STRICT | より低ジッタ重視(CPU 消費は増えやすい) |
LOW_POWER | 省電力重視(ジッタは増えやすい) |
UsleepWin.GetStats() で以下のスレッドローカル統計を取得可能
SpinRelaxYieldSwitchYieldSleep0YieldSleep1WaitableTimerUses同一ソースから以下をビルドします。
net10.0-windows)
LibraryImport ベースの P/Invoke(source generator)netstandard2.1)
build_all.batbuild_net10.batbuild_unity_generic.batbuild_unity_windows.batclean.bat生成物の例:
pack/bin/Release/usleep_win_cs.0.1.0.nupkgunity/bin/Release/netstandard2.1/usleep_win_cs.unity.dllusing Usleep.Win;
UsleepWin.SleepMicroseconds(300); // 300 µs
using Usleep.Win;
const ulong tickUs = 1000;
ulong next = UsleepWin.NowSteadyMicroseconds();
for (;;)
{
next += tickUs;
UsleepWin.SleepUntilSteadyMicroseconds(next); // ドリフト抑制
// do work...
}
using Usleep.Win;
UsleepWin.SetProfile(UsleepProfile.BALANCED);
UsleepWin.SetTailSpinMicroseconds(250);
UsleepWin.SetYieldPolicy(UsleepYieldPolicy.SLEEP0);
// 低ジッタ寄り
UsleepWin.SetProfile(UsleepProfile.STRICT);
// 省電力寄り
UsleepWin.SetProfile(UsleepProfile.LOW_POWER);
using Usleep.Win;
UsleepStats st = UsleepWin.GetStats(reset: false);
Console.WriteLine($"spin={st.SpinRelax}, sleep0={st.YieldSleep0}, timer={st.WaitableTimerUses}");
using Usleep.Win;
if (UsleepWin.InitTimerResolution(1))
{
// ... high-resolution timer dependent work
UsleepWin.ShutdownTimerResolution();
}
timeBeginPeriod(1)はシステム全体に影響します。必要時のみ使用してください。
BALANCED。STRICTSetTailSpinMicroseconds(300〜500) 付近を検討LOW_POWERSLEEP1 ベースワークロードにより最適値は変わるため、目標周期・許容遅着・CPU 使用率を合わせて計測調整するのが推奨です。
build_unity_generic.bat か build_unity_windows.bat で DLL を作成Assets/Plugins/... に DLL を配置asmdef のプラットフォーム制限を適切に設定(Windows-only 版は Windows 向けに制限)詳細は samples/UnityDemo/README.md を参照してください。
src/ // ライブラリ本体ソース(Interop/Intrinsics 含む)
pack/ // NuGet パッケージ用 csproj
unity/ // Unity DLL 用 csproj
samples/ConsoleDemo/ // C# コンソール使用例
samples/UnityDemo/ // Unity 利用メモ
document/ // ドキュメント(英語版 README など)
build_all.bat // 全ターゲットビルド
build_net10.bat // NuGet(net10.0-windows)ビルド
build_unity_generic.bat// Unity Generic DLL ビルド
build_unity_windows.bat// Unity Windows-only DLL ビルド
MIT License。詳細は LICENSE を参照してください。
Issue / PR 歓迎です。計測結果やチューニング知見の共有も歓迎します。