Почему мой секундомер так низок? - PullRequest
11 голосов
/ 27 февраля 2010
  Debug.WriteLine("Timer is high-resolution: {0}", Stopwatch.IsHighResolution);
  Debug.WriteLine("Timer frequency: {0}", Stopwatch.Frequency);

Результат:

  Timer is high-resolution: True
  Timer frequency: 2597705

В этой статье (с 2005 года!) Упоминается частота 3579545, что на миллион больше, чем у меня. В этом сообщении в блоге упоминается частота 3 325 040 000, что безумие.

Почему моя частота намного ниже? Я на машине с i7 920, так разве это не должно быть быстрее?

Ответы [ 4 ]

25 голосов
/ 27 февраля 2010

3,579,545 - магическое число. Это частота в герцах до деления ее на 3 и подачи в чип таймера 8053 в оригинальном IBM PC. Нечетное число было выбрано не случайно, это частота сигнала цветовой синхронизации в телевизионной системе NTSC, используемой в США и Японии. Инженеры IBM искали дешевый кристалл для реализации генератора, ничто не было дешевле, чем тот, который использовался в каждом телевизоре.

Как только клоны IBM стали широко доступны, их дизайнерам по-прежнему было важно выбрать ту же частоту. Многие программы MS-DOS полагались на тиканье с такой скоростью. Непосредственное обращение к чипу было обычным преступлением.

Это изменилось, когда Windows появилась. Версия Windows 2 была первой, которая виртуализировала чип таймера. Другими словами, программному обеспечению больше не разрешалось напрямую обращаться к чипу таймера. Процессор был настроен на работу в защищенном режиме и перехватил попытку использовать инструкцию ввода-вывода. Вместо этого запускается код ядра, позволяющий подделать возвращаемое значение инструкции. Теперь стало возможным иметь несколько программ, использующих таймер, не наступая друг другу на пальцы. Важный первый шаг, чтобы сломать зависимость от того, как на самом деле реализовано оборудование.

Win32 API (Windows NT 3.1 и Windows 95) формализовал доступ к таймеру с помощью API, QueryPerformanceCounter () и QueryPerformanceFrequency (). Компонент уровня ядра, аппаратный уровень адаптации, позволяет BIOS передавать эту частоту. Теперь разработчики аппаратных средств могли по-настоящему отбросить зависимость от точной частоты. Между прочим, это заняло много времени, около 2000 года подавляющее большинство машин по-прежнему имели прежний уровень.

Но бесконечное стремление сократить расходы на разработку ПК положило этому конец. В настоящее время разработчик аппаратного обеспечения просто выбирает любую частоту, которая оказывается легко доступной в чипсете. 3 325 040 000 будет таким числом, это, скорее всего, тактовая частота процессора. Такие высокие частоты распространены в дешевых разработках, особенно в тех, которые имеют ядро ​​AMD. Ваш номер довольно необычный, некоторые шансы, что ваша машина не дешевая. И что таймер намного точнее, тактовые частоты процессора имеют типичные допуски электронных компонентов.

7 голосов
/ 27 февраля 2010

Частота зависит от HAL (Уровень аппаратной абстракции). Еще во времена Pentium было обычным делом использовать тик процессора (который основывался на тактовой частоте процессора), чтобы у вас были действительно высокочастотные таймеры.

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

1 голос
/ 04 августа 2012

Я думаю, что 2,597,705 = частота вашего процессора. Майн 2 737 822 i7 930

1 голос
/ 27 февраля 2010

Значение Stopwatch.Frequency указано в секунду, поэтому ваша частота 2597705 означает, что у вас более 2,5 миллионов тиков в секунду. Сколько точности вам нужно?

Что касается вариаций частоты, это аппаратно-зависимая вещь. Некоторые из наиболее распространенных аппаратных различий - это количество ядер, частота каждого ядра, текущее состояние питания вашего процессора (или ядер), включена ли ОС динамическая настройка частоты процессора и т. Д. Ваша частота не будет всегда будет одинаковым, и в зависимости от того, в каком состоянии находится ваш процессор, когда вы его проверяете, он может быть ниже или выше, но обычно примерно одинаковым (для вас, вероятно, около 2,5 млн.)

...