Почему добавление даже небольшой задержки во время опроса уменьшает загрузку процессора? - PullRequest
0 голосов
/ 04 октября 2018

Мне нужно создать программное обеспечение, которое должно опрашивать аппаратное устройство.

static void Main(string[] args)
{
    while(true)
    {
        DoSomething();
        Task.Delay(1).Wait();
    }
}

static void DoSomething(){}

Я заметил, что если я не добавлю ни малейшей задержки, загрузка ЦП возрастет до 30-40%, но даже приЗадержка в 1 мс составляет около двух процентов.

Моя среда разработки - .net / c #.

Для меня и бизнеса нет необходимости добавлять задержку в 1 мс, но, похоже,изменить мир к лучшему.

Такое чувство, что было бы неплохо добавить даже небольшую задержку.Почему?

РЕДАКТИРОВАТЬ :

Учитывая приведенный выше фрагмент кода с пустым DoSomething(), почему добавление Task.Delay(1).Wait(); так сильно снижает загрузку ЦП?Это такая тривиальная вещь.Почему это оказывает такое влияние?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Допустим, DoSomething занимает 0.1 ms.Затем без задержки он выполняется 10_000 раза в секунду.С задержкой это выполняется менее чем 900 раз в секунду.Как отмечается в комментариях, фактическая задержка зависит от ОС и может составлять 15.6 ms, поэтому на самом деле у вас может быть ~ 60 вызовов в секунду.

Таким образом, объем работы, который должен выполнять ЦПрезко отличается.

0 голосов
/ 04 октября 2018

Написание чего-то вроде

while (true)
{
    DoSomething();   
}

вы фактически указываете компилятору создать код, который можно перевести на человеческий язык, например:

Уважаемый процессор, пожалуйстаделайте как можно быстрее DoSomething().

Это объяснение того, почему загрузка процессора падает, когда вы добавляете даже небольшую задержку.Потому что тогда код будет переведен примерно так:

Уважаемый процессор, пожалуйста, сделайте DoSomething(), и тогда вы сможете отдохнуть миллионы циклов.После этого снова выполните DoSomething().

Обратите внимание, что для процессора, работающего на частоте 2-4 ГГц, много 1 мс.

...