Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Измерение времени с точностью до мс   Найти похожие ветки 

 
Andrew_Rostov   (2004-04-24 15:11) [0]

Задача измерить время отработки процедуры. Наиболее точный результат получился с помошью:
var
TimeStart,TimeEnd:TDateTime;
TimeElapsed:TTimeStamp;
procedure OnClick;
begin
TimeStart:=Time;
ProcedureA;
TimeEnd:=Time;
TimeElapsed:=DateTimeToTimeStamp(TimeEnd-TimeStart); //время в мс
end;

При построении диаграммы времени выполнения получил ступеньки с высотой около 16 мс. Возможная причина - насколько я помню, системный таймер срабатывает каждые 16 мс.

Возможно ли в принцине измерять отрезки времени длиной меньше 16 мс?


 
Kerk ©   (2004-04-24 15:16) [1]

Измерять можно с точностью до 20мс.


 
Anatoly Podgoretsky ©   (2004-04-24 15:27) [2]

Измерить можно, стабильность получить нельзя


 
panov ©   (2004-04-24 16:36) [3]

Используй GetTickCount.


 
evvcom ©   (2004-04-24 16:51) [4]

Во время выполнения ProcedureA могут и скорее всего будут выполняться и другие процедуры других потоков, других процессов. Так что точного чистого времени выполнения процедуры в виндах получить не получится.


 
N170   (2004-04-24 16:56) [5]

Ещё как вариант - QueryPerformanceCounter() + QueryPerformanceFrequency(). Там и точность и стабильность.
(Забыли?!)


 
Andrew_Rostov   (2004-04-24 17:19) [6]

Спасибо, а можно по подробнее о  QueryPerformanceCounter() + QueryPerformanceFrequency() или GetTickCount?
Задача даже не в том, чтобы точно посчитать время отработки, а чтобы избавиться от "квантования" результатов на 16 мс отрезки времени - на графике зависимости времени работы от объема данных слишком явно видны ступеньки.


 
vengo   (2004-04-25 13:09) [7]

Unit HighTimer;
interface
 Uses Windows;
 Type
 THRTimer = Class(TObject)
   Constructor Create;
   Function StartTimer : Boolean;
   Function ReadTimer : Double;
private
  StartTime : Double;
  ClockRate : Double;
public
  Exists    : Boolean;
End;
implementation
Constructor THRTimer.Create;
Var
  QW : TLargeInteger;
BEGIN
   Inherited Create;
   Exists := QueryPerformanceFrequency(QW);
   ClockRate := LARGE_INTEGER(QW).QuadPart;
END;

Function THRTimer.StartTimer : Boolean;
Var
  QW : TLargeInteger;
BEGIN
  Result := QueryPerformanceCounter(QW);
  StartTime := LARGE_INTEGER(QW).QuadPart;
END;

Function THRTimer.ReadTimer : Double;
Var
  ET : TLargeInteger;
BEGIN
  QueryPerformanceCounter(ET);
  Result := 1000000*( LARGE_INTEGER(ET).QuadPart - StartTime)/ClockRate;
END;

end.


 
Andrew_Rostov   (2004-04-25 16:29) [8]

Насколько я понимаю для использования нужно:
1) поместить этот код в файл и прописать в uses имя этого файла
2) объявить глобальную переменную My_Timer:THRTimer;
3) при создании формы вызвать My_Timer.Create;
4) для измерения времени делать следующее:
  My_Timer.StartTimer;
  ProcedureA;
  TimeElapsed:=My_Timer.ReadTimer;
5) при закрытии формы вызвать My_Timer.Free

Проблема в том, что при создании таймера получаем исключение на строке Exists := QueryPerformanceFrequency(QW);
Если же My_Timer.Create не вызывать, то при чтении значения таймера ClockRate будет равным 0 и получаем исключение деления на 0.


 
panov ©   (2004-04-25 16:51) [9]

function TickCount:Int64;
begin
 QueryPerformanceCounter(Result);
end;

function DeltaTickToSeconds(const Delta: Int64):Double;
var
 TickFreq: Int64;
begin
 QueryPerformanceFrequency(TickFreq);
 Result := Delta/TickFreq;
end;

var
 DeltaCounter: int64;
begin
  DeltaCounter := TickCount;
  MyProc;  //измеряемая процедура
  DeltaCounter := TickCount-DeltaCounter
 ShowMessage(FloatToStr(DeltaCounter)+" secouds");



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
9-1074255124
Ландграф Павел
2004-01-16 15:12
2004.05.30
PowerDraw3 и 3D


1-1084476875
SergeyV
2004-05-13 23:34
2004.05.30
Как в RichEdit выделить цветом конкретное слово


1-1084804021
SMART_n
2004-05-17 18:27
2004.05.30
Отслеживание создания файла


14-1083913278
pasha_golub
2004-05-07 11:01
2004.05.30
Мое публичное заявление :-)


1-1084605159
AlexLebed
2004-05-15 11:12
2004.05.30
Проблема при переходе из одного типа в другой.