DbgHRPCCurrent

From SunFlurry wiki
Jump to: navigation, search
  DbgHRPCCurrent (Функции отладки)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Визуальность:Нет

Отладочная функция получает текущее значение таймера высокой точности (High-Resolution Performance Counter, обычно включение происходит в BIOS компьютера). Если таймер не включен на системном уровне, функция возвращает 0. Таймер высокой точности позволяет точно замерить время выполнения операций, также он используется встроенным в отладчик профайлером, без него профайлер будет подсчитывать только количество вызовов, но не время их исполнения.

Синтаксис

dbgHRPCCurrent():<Текущее значение т.в.т. (INT)>

Возвращаемое значение

Функция возвращает число, показания т.в.т или 0, если доступ к таймеру отсутствует

Примеры

//Создаем переменную заранее
a:=0;

Чл1:=Date();

For i:=1 To 1000000 Do
  a:=0;
EndDo;

Чл1:=GetPeriodMs(Чл1);
Message("Руководствуясь системными часами, миллион операций присваивания занял: "+Чл1+" мс.");

If DbgHRPCAvailable Then
  Чл2:=dbgHRPCCurrent();  

  For i:=1 To 1000000 Do
    a:=0;
  EndDo;

  Чл2:=dbgHRPCGetPeriod(Чл2);
  Чл2:=Чл2/1000000;
  Message("Руководствуясь т.в.т., миллион операций присваивания занял: "+Чл2+" мс.");
EndIf;

//Для i5:
//"Руководствуясь системными часами, миллион операций присваивания занял: 593 мс." -- точность этого таймера составляет не более 20мс.
//"Руководствуясь т.в.т., миллион операций присваивания занял: 597.547944 мс." -- точность этого таймера очень велика (зависит от конкретной машины)
//  Если исполнить блок несколько раз, появится разброс в показаниях, обусловленный тем, что операционная система в фоне может выполнять другие процессы.
//Нужно заметить, что эксперимент не совсем верно ответил на вопрос, какое время занимает выполнение миллиона операций присваивания, так как
//  и для первого и для второго случая, в это время включаются дополнительные команды конструкции цикла и нахождения времени после окончания цикла.
//Чтобы исключить время исполнения инструкций цикла и других инструкций, достаточно провести замер без инструкции "a:=0". Для двух циклов,
//  время должно быть несколько разным, так как GetPeriodMs и dbgHRPCGetPeriod занимают разное время.
//
//Также можно использовать встроенный профайлер, однако, при включенном профайлере скорость исполнения инструкций будет несколько ниже.