Насколько я понимаю, Thread.Sleep(0) заставляет контекстный переключатель в ОС.
Я хотел проверить, какое максимальное время, которое может пройти в приложении, чтобы получить некоторое время процессора.
Итак, я создал приложение, которое делает Thread.Sleep(0) в цикле while (С#) и вычисляет время, которое проходит между каждым вызовом.
Когда это приложение является единственным, работающим на двухъядерном тестовом ПК, максимальное наблюдаемое время составляет менее 1 миллисекунды (со средним значением 0,9 микросекунды), и оно использует весь доступный центральный процессор (100%).
Когда я запускаю его вместе с приложением для заполнения процессора (все с одинаковым приоритетом), максимальное время составляет около 25 мс, а среднее время составляет 20 мс. Он ведет себя точно так, как я ожидаю. И время очень стабильное.
Всякий раз, когда он получает некоторое процессорное время, он сразу же возвращает управление тому, кто имеет какую-то обработку, он похож на горячую картофельную игру (загрузка процессора падает до 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 мс, но мы время от времени пропускаем некоторые крайние сроки (менее 1% времени) и В настоящее время я пытаюсь улучшить этот номер.
Я хотел проверить, какова текущая изменчивость, вызванная другим процессом на той же машине: я утверждаю, что, приложив приложение, написанное выше на этой машине в режиме реального времени, максимальное наблюдаемое время скажет мне, какая изменчивость вызвана система. И.Е. У меня есть 300 мс, но максимальное наблюдаемое время до того, как поток получает некоторое время процессора, составляет 50 мс, поэтому для повышения производительности я должен установить время обработки на максимум 250 мс (так как я мог уже опоздать на 50 мс).