Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
КОМПЬЮТЕР ДОМА
Листинг 1
ОС. Конечно, по абсолютной точности он будет усту- ксимальное число, не превосходящее делитель, все
пать стандартным средствам для измерения больших биты которого установлены в «1». Если маски не вы-
интервалов времени (например, погрешность может со- числять, а задавать константами, то на медленных
ставить несколько секунд за час — из-за неточности процессорах будет слишком маленький период обну-
градуировки), но при определении малых интервалов, а ления, а на тех, что ожидаются в будущем, вероятно,
также при вычислении отношения длительности двух произойдет аварийное завершение программы из-за
измерений его точности вполне достаточно. ошибки деления.
Измерение времени на основе внутреннего счет- Чтобы поточнее определить частоту ЦП, измере-
чика процессора реализовано в модуле, приведенном ния нужно проводить несколько раз, далее их массив
в листинге 1. Он содержит три функции для получе- сортируется и при вычислении берется только его
ния отсчетов времени, функцию для получения пол- центральная часть (наибольшие и наименьшие ре-
ного 64-разрядного значения счетчика (вдруг она ко- зультаты отбрасываются). Таким способом удается
му-нибудь понадобится), а также (в качестве побоч- отсечь отдельные измерения с большой погрешно-
ного продукта) функции, возвращающие измерен- стью, характерные для многозадачных ОС и вызван-
ную частоту процессора и предполагаемую погреш- ные разделением времени.
ность ее измерения. Модуль написан для TMT Pascal 4.0 и совместим с
Наличие трех функций измерения объясняется тем, любой из целевых платформ: DOS, Windows или OS/2,
2
что использовать 64-разрядные числа в большинстве причем в двух последних, как консольное приложение .
случаев неудобно (пока еще не нашли широкого при- Правда, при работе в стандартной оконной среде
менения 64-разрядные процессоры), а 32-разрядный Windows в приложениях, использующих кодовую стра-
счетчик, работающий на высокой частоте, довольно ча- ницу 866, возникают проблемы с кириллицей. Поэтому
сто обнуляется. Поэтому для измерения коротких ин- здесь я изменил своему правилу применять в програм-
тервалов времени следует предпочесть счетчик с макси- мах сообщения на русском языке. Другой способ реше-
мальным разрешением, равным 1 мкс, а в остальных ния проблемы описан во врезке.
случаях — с более грубым. Если необходимо переделать модуль для одно-
Градуировка модуля измерения времени выполня- платформного компилятора, не поддерживающего
ется в блоке инициализации, но эта процедура дос- совместимую с DOS процедуру GetTime, то послед-
тупна и извне. Она бывает нужна тогда, когда точ- нюю следует заменить стандартной операцией для
ность определения тактовой частоты процессора при выбранной ОС. Например, для Windows целесооб-
загрузке может показаться недостаточной. Пример разно выбрать GetTickCount, и тогда из цикла изме-
использования некоторых функций модуля приведен рения можно будет убрать дополнительную провер-
в листинге 2. ку на обнуление сотых долей секунды. Константы
В блоке инициализации модуля происходят под- модуля подобраны для оптимальной работы при ин-
счет частоты процессора, оценка погрешности вы- тервале приращения показаний системных часов,
числения, а также определение коэффициентов деле- равном 55 мс, но модуль сохраняет работоспособ-
ния для всех точек входа и масок для них. Последние
необходимы для того, чтобы предотвратить перепол-
нение при целочисленном делении 64-разрядного 2
Точнее, сам модуль сохраняет работоспособность и в GUI, но при-
числа на 32-разрядное. Маска представляет собой ма- мер программы осуществляет вывод в консольное окно или файл.
GetTime — предназначена для получения показа- измерений. Впрочем, хороший стиль программирова-
ний астрономического времени в часах, минутах и се- ния требует, чтобы подобные ситуации специально от-
кундах. С некоторой натяжкой может быть использо- слеживались. И тогда процедуру можно будет безболез-
вана для измерения временны́х интервалов от не- ненно использовать для измерения времени в интерва-
скольких секунд (при условии, что требуется точ- ле до получаса.
ность не ниже 1%). Данная процедура неудобна из-за GetTimer_50 — наверное, наилучший выбор для
того, что нужно отслеживать переходы на следую- программ, написанных для использования на ком-
щие секунду, минуту, час, а также сутки. Она работа- пьютере дома или в офисе. Счетчик переполнится
ет медленно из-за многочисленных промежуточных лишь спустя сутки с небольшим после последней
вызовов и преобразований. В 24 ч 00 мин 00 с показа- перезагрузки ПК, поэтому если компьютер ежеднев-
ния сбрасываются. но выключается или хотя бы перезапускается, то пе-
GetTickCount — подходит для измерения интерва- реполнение счетчика не грозит. В то же время про-
лов времени от 0,5 с в случае, если допустима погреш- цедура обеспечивает достаточную точность, напри-
ность в пределах 1%. При этом она предпочтительнее мер, при определении того, как распределяется вы-
всех остальных для измерения больших интервалов числительная нагрузка между разными блоками
времени (в пределах нескольких суток), так как в отли- при формировании одного кадра для игр в режиме
чие от GetTime не требует преобразований. Эта процеду- реального времени.
ра позволяет определить время в удобных единицах и GetTimer_1000 — несколько точнее, чем GetTick-
не несет в себе погрешности измерения частоты про- Count на небольших интервалах (до нескольких се-
цессора. Данная процедура — самая быстрая, она вы- кунд), и менее точна на больших вследствие погреш-
полняет наиболее простую работу, а именно читает зна- ности определения частоты. А если требуется знать
чения переменной из оперативной памяти или даже из не действительное значение времени, а отношение
кэш-памяти процессора. длительности двух измеренных интервалов, то всегда
QueryPerformanceCounter — опрашивает при ра- обеспечивает более высокую точность, чем
боте порты таймера, подключенного по шине ISA, GetTickCount. Кроме того, может использоваться в
или ее аналога в современных наборах микросхем. Ра- среде любой ОС.
ботает очень долго — несколько миллисекунд, что су- GetCPUtick — для измерения длительности выпол-
щественно искажает результаты измерения. Поэтому нения коротких фрагментов кода в тактах процессора, а
диапазон ее применения начинается с интервалов в также в качестве основы для разработки других систем
сотни микросекунд. Кроме того, сама единица измере- измерения времени.
ния довольно неудобна. Тем не менее процедура не InitTimer — применяется для реинициализации тай-
требует градуировки, возвращаемое ею значение ни- мера, т. е. для вычисления частоты процессора и всех
когда не переполняется и имеет достаточно высокое необходимых констант заново. Пример использования
разрешение, так что она может быть полезна тогда, дается в листинге 2.
когда нужно использовать лишь одну операцию в В заключение следует еще раз обратить внимание на
очень широком диапазоне: от долей миллисекунд до то, что функции GetTimer_XX нежелательно приме-
нескольких месяцев и даже лет. нять для определения времени суток, так как из-за по-
GetTimer_1 — применяется от десятков микросе- грешности измерения оно не будет совпадать с тем, ко-
кунд до десятков секунд, если, конечно, не хочется «на- торое показывают системные часы. ■
тыкаться» на переход через 0 чаще одного раза на 100 Сергей Андрианов