Ответ 1
Класс Stopwatch не является надежным.
Это ненадежно на процессорах, у которых нет постоянной тактовой частоты (большинство процессоров могут уменьшить тактовую частоту, чтобы сберечь энергию). Это подробно объясняется здесь.
Я видел другие сообщения пользователей, в которых показано время секундомера, затрачиваемое на "Thread.Sleep(5000)", равное 5000 мс.
Но моя программа дает следующие результаты
for (int i = 0; i < 20; ++i)
{
Stopwatch sw = Stopwatch.StartNew();
DateTime start = DateTime.Now;
Thread.Sleep(5000);
sw.Stop();
Console.Out.WriteLine(
"StopWatch Diff:" +
sw.ElapsedMilliseconds.ToString());
Console.Out.WriteLine(
"DateTime Diff:" +
DateTime.Now.Subtract(start).TotalMilliseconds.ToString());
}
StopWatch Diff:1684 DateTime Diff:5262.592 StopWatch Diff:1625 DateTime Diff:4997.12 StopWatch Diff:1604 DateTime Diff:4997.12 StopWatch Diff:1601 DateTime Diff:4997.12 StopWatch Diff:1690 DateTime Diff:4997.12 StopWatch Diff:1603
Это только я, кто наблюдает за этим поведением? Почему секундомер измеряет 1,6 секунды, когда прошло 5 секунд. Это время, когда поток фактически запущен?
Класс Stopwatch не является надежным.
Это ненадежно на процессорах, у которых нет постоянной тактовой частоты (большинство процессоров могут уменьшить тактовую частоту, чтобы сберечь энергию). Это подробно объясняется здесь.