Я реализовал этот простой цикл на C#, который выполняется 100 раз и на каждой итерации ожидает 50 мс.
Код: Выделить всё
using System.Diagnostics;
var sw = Stopwatch.StartNew();
for (int i = 0; i < 100; i++)
{
Thread.Sleep(50);
}
sw.Stop();
Console.WriteLine("Elapsed: {0}", sw.Elapsed);
Я ожидал, что этот цикл займет около 5 секунд, плюс немного дополнительного времени для выполнения цикла сто раз.
К моему удивлению, это заняло более 6 секунд, вот результат.
Код: Выделить всё
$ dotnet run -c Release
Elapsed: 00:00:06.2177943
Может кто-нибудь сказать, в чем причина этого? Является ли это дополнительными затратами, связанными с тем, что ОС приходится планировать поток каждый раз, когда ей нужно выйти из спящего режима? Или поскольку не гарантируется, что спящий режим будет ровно 50 мс, он может спать немного дольше на каждой итерации, и это суммируется? Стоит ли ожидать такого уровня неточности?
(Это касается .NET 10 в Windows 11.)
Подробнее здесь:
https://stackoverflow.com/questions/798 ... stead-of-5