Использование процедуры GetTime

Самый простой способ замерить время выполнения кода - это запомнить системное время в начале работы алгоритма, затем (по окончании его работы) снова получить системное время, и вычесть из него то, что было запомнено при старте. Проще всего для этой цели воспользоваться стандартной процедурой GetTime модуля Dos (ниже предлагается функция, возвращающая системное время в сотых долях секунды. Соответственно, время работы программы тоже вычисляется в сотых долях секунды).

Function GetTime: LongInt;Var h, m, s, ms: Word;begin Dos.GetTime(h, m, s, ms); GetTime:= ms + 100 * (s + 60 * (m + 60 * h));end;...{ Вызывать вот так: }start:= GetTime;... { Здесь - алгоритм, время выполнения которого надо замерить }WriteLn('Время выполнения = ', GetTime - start);...

Поскольку способ самый простой, у него много недостатков, в частности, результат будет неверным, если во время работы алгоритма (после первого вызова функции GetTime, но перед вторым) сменится дата... Тогда данный способ может показать и отрицательное время, но в любом случае оно будет неправильным (даже если будет правдоподобным)...

Кроме того, результат может зависеть от настроек среды программирования (или используемых директив компилятора)...


Работа с ячейкой памяти $0000:$046C

Если не хочется подключать модуль Dos, и пользоваться GetTime (кстати, вполне оправданное желание, т.к. сам вызов GetTime тоже занимает какое-то время, следовательно замер становится еще более неточным), можно взять значение числа тиков таймера напрямую из памяти по адресу $0000:$046C (4 байта), запомнить его, и после завершения работы основного алгоритма опять же вычесть из нового значения этой ячейки памяти ранее запомненное. Здесь, точно так же, как и в случае с GetTime, возникает опасность смены даты во время работы программы... Если разность конечного и начального времени отрицательна, значит, была смена даты, и, чтобы получить правильное значение времени, к нему надо добавить $1800B0.
Полученное значение делим на 18.2 (таймер "тикает" каждые 1/18.2 секунды), и получаем время работы программы с точностью около 0.05 сек.

Var time: LongInt;... time:= MemL[0:$046C];... { Здесь - программа }time:= MemL[0:$046C] - Time; If time < 0 Then time:= time + $1800B0;WriteLn('Время выполнения = ', (time / 18.2):6:2);...


Использование счетчика тактов процессора (RDTSC)

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: