2010-04-06 3 views
9

На MSDN странице Stopwatch class я обнаружил ссылку на interesting article, который делает следующее заявление о Секундомере:Действительно ли Секундомер разбит?

Однако есть некоторые серьезные проблемы:

  • Это может быть ненадежным на ПК с несколькими процессорами. Из-за ошибки в
    BIOS, Start() и Stop() должны быть выполнены на одном процессоре, чтобы получить правильный результат.

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

Я немного запутался. Я видел tons of examples использования секундомера, и никто не упоминает об этом недостатках. Насколько это серьезно? Следует ли избегать использования секундомера?

ответ

2

Это не сломанный у него просто есть ограничения. Для большинства целей (читай: неформальный микро-бенчмаркинг) StopWatch подходит для использования просто потому, что он достаточно хорош для неформального тестирования. Для более формальных целей вы, скорее всего, захотите свернуть свой собственный инструментальный код, как вы бы гораздо больше инвестировали в получение правильных результатов.

2

Более интересные вопросы:

  1. при каких условиях будет Stop() будет выполняться на другом процессоре, чем Start()?
    .
    В большинстве сценариев приложений ответ «нет».

  2. При каких условиях будет изменяться тактовая частота процессора в течение измеренного интервала?
    .
    В тестах с интенсивным процессором «none».

+0

В случае интенсивных тестов CPU вы, вероятно, правы. Но в случае асинхронного ввода-вывода вещи могут быть совершенно разными. –

+0

Я не согласен с вашим первым заявлением. У меня был один из этих сломанных компьютеров, и он появился довольно часто. Это даже разбило игры из-за времени, идущего назад. – CodesInChaos

2

Смотрите примечания в статье MSDN:

На многопроцессорных компьютерах, это не имеет значения, какой процессор нить работает на. Однако из-за ошибок в BIOS или аппаратной абстракции (HAL) вы можете получать разные результаты синхронизации на разных процессорах. Чтобы указать сродство процессора к потоку, используйте метод ProcessThread.ProcessorAffinity.