C# Секундомер показывает неправильное время

Я видел другие посты пользователей, которые показывают, что время измерения секундомера, потраченное в "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());
}

Дифференциал секундомера:1684
DateTime Diff:5262,592
Дифференциал секундомера:1625
DateTime Diff:4997.12
Дифференциал секундомера:1604
DateTime Diff:4997.12
Дифференциал секундомера:1601
DateTime Diff:4997.12
Дифференциал секундомера:1690
DateTime Diff:4997.12
Дифференциал секундомера:1603

Только я наблюдаю за этим поведением? Почему секундомер измеряет 1,6 секунды, когда на самом деле прошло 5 секунд. Это время, когда поток действительно работает?

1 ответ

Решение

Класс Секундомер не надежен.

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

Другие вопросы по тегам