c# - 线程. sleep (0) : What is the normal behavior?

标签 c# windows performance multithreading

据我了解,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/

相关文章:

node.js - Node.js 应用程序监控服务 - OpBeat 替代方案

C# 继承窗体中的类

c++ - C++ 代码中的 volatile 相关错误

C#。 OpenTK 与 OpenGL 的代码相同吗?

c# - 在 C# 窗口中绘制一条绝对线

c# - 如何找到 EXE 的安装位置 - 正确的方法?

android - 为什么安卓模拟器很慢?

linux - libipq 性能问题

c# - 使用 StackTrace 推断方法的调用者

c# - 为什么我不能在 Windows 窗体设计 View 中更改 TextBox 控件的高度?