Главная страница
    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.035 c
11-1073898845
avakss
2004-01-12 12:14
2004.05.30
QueryEndSession


1-1085054498
Т_М_П
2004-05-20 16:01
2004.05.30
Как написать символ в Мемо?


9-1075736940
Igoryok
2004-02-02 18:49
2004.05.30
Зарисовка области по точкам соединённых кривыми


1-1084697643
Blackgrin
2004-05-16 12:54
2004.05.30
отработка при нажатии на клавиатурные стрелки


9-1070047831
Sergeef
2003-11-28 22:30
2004.05.30
Создание игр на Дельфи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский