Главная страница
    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.46 MB
Время: 0.038 c
9-1074659199
NZed
2004-01-21 07:26
2004.05.30
Овцы и Волк


1-1084785439
Саша
2004-05-17 13:17
2004.05.30
StringGrid


11-1073742406
Phantomaz
2004-01-10 16:46
2004.05.30
Как вкл./откл. выпадание меню по клику на иконке в трее ?


3-1083845681
Wolferio
2004-05-06 16:14
2004.05.30
Сервер!!!???


3-1084266514
Shura
2004-05-11 13:08
2004.05.30
ADOConnection. Не закрывается соединение с базой данных.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский