据我了解,Thread.Sleep(0) 会强制在操作系统上进行上下文切换。
我想检查应用程序在接收一些 CPU 时间之前可以传递的最长时间是多少。
因此我构建了一个应用程序,它在 while 循环 (c#) 中执行 Thread.Sleep(0) 并计算每次调用之间耗时。
当此应用程序是唯一一个在双核测试 PC 上运行的应用程序时,观察到的最长时间正好在 1 毫秒以下(平均为 0.9 微秒),并且它使用了所有可用的 CPU (100%)。
当我在 CPU Filling 虚拟应用程序(都具有相同的优先级)上运行它时,最长时间约为 25 毫秒,平均时间为 20 毫秒。它的行为完全符合我的预期。而且时间很稳定。
每当它获得一些 CPU 时间时,它会立即将控制权交还给有一些处理要做的人,这就像烫手山芋游戏(CPU 使用率下降到 0%)。如果没有其他应用程序在运行,则控件会立即返回。
鉴于此行为,我希望此应用程序对运行实际应用程序的计算机的影响最小。 (并给出我期望在运行的应用程序中看到的实际“延迟”)。但令我惊讶的是,它确实(以一种可观察到的方式)对该特定系统的性能产生了负面影响。
我是否遗漏了有关 Thread.Sleep(0) 的一些重要信息?
作为引用这里是这个应用程序的代码
private bool _running = true;
private readonly Stopwatch _timer = new Stopwatch();
private double _maxTime;
private long _count;
private double _average;
private double _current;
public Form1()
{
InitializeComponent();
Thread t = new Thread(Run);
t.Start();
}
public void Run()
{
while(_running)
{
_timer.Start();
Thread.Sleep(0);
_timer.Stop();
_current = _timer.Elapsed.TotalMilliseconds;
_timer.Reset();
_count++;
_average = _average*((_count - 1.0)/_count) + _current*(1.0/_count);
if(_current>_maxTime)
{
_maxTime = _current;
}
}
}
为清楚起见进行了编辑(申请目的): 我目前正在运行一个软实时多线程应用程序(好吧,一组应用程序)需要大约每 300 毫秒对一些输入使用react,但我们确实会不时错过一些截止日期(不到 1% 的时间)和我目前正在努力提高这个数字。
我想验证由同一台机器上的其他进程引起的当前可变性是什么:我很难通过在这台半实时机器上安装上面编写的应用程序,观察到的最长时间会告诉我什么可变性是由系统。 IE。我有 300 毫秒,但在线程获得一些 CPU 时间之前的最大观察时间为 50 毫秒,因此为了提高性能,我应该将处理时间设置为最大值 250 毫秒(因为我可能已经晚了 50 毫秒)。
最佳答案
它不会强制上下文切换,只有 Sleep(1) 会这样做。但是,如果任何进程中有任何其他线程准备好运行并且具有更高的优先级,则 Sleep(0) 将让出处理器并让它运行。您可以通过运行一个调用 Sleep(0) 的无限循环来看到这一点,它将在一个内核上消耗 100% 的 CPU 周期。我不明白为什么你没有观察到这种行为。
保持系统响应的最佳方法是为您的线程设置低优先级。
关于c# - 线程. sleep (0) : What is the normal behavior?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257708/