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

Вниз

время работы в миллисекундах.   Найти похожие ветки 

 
TakTak   (2006-09-01 12:58) [0]

есть процедурка. мне нужно определить сколько миллисекунд ей понадобилось на работу. Как сделать??? обычный таймер на сколько я знаю с такой точностью (1-25 мс) работать не умеет.


 
Barloggg   (2006-09-01 13:01) [1]

мультимедийный умеет.


 
Desdechado ©   (2006-09-01 13:01) [2]

t:=Now;
вызов процедурки
ms:=Now-t;


 
Fay ©   (2006-09-01 13:02) [3]

QueryPerfomanceCounter


 
TakTak   (2006-09-01 13:03) [4]

>>Desdechado

Now - показывает только секунды, миллисекунд нет, соответственно, говорит что время работы = 0


 
Palladin ©   (2006-09-01 13:04) [5]

способ 1
var
c:Cardinal;
begin
c:=gettickcount;
процедурка
showmessage(inttostr(gettickcount-c));
end;

способ 2

воспользоваться юнитом

unit UWRTickers;

interface
Type
TTicker=Class
 Private
  m_nFreq,
  m_nStartValue,
  m_nLastTickValue,
  m_nLastTickCount,
  m_nNowTickValue,
  m_nTickCount:Int64;
  Function lcGetLastTickTime:Extended;
  Function lcGetAllTime:Extended;
  Function lcGetAvgTickTime:Extended;
 Public
  Constructor Create;
  Procedure Reset; Virtual;
  Procedure Tick(p_nCount:Integer=1); Virtual;
  Property LastTickTime:Extended Read lcGetLastTickTime;
  Property AllTime:Extended Read lcGetAllTime;
  Property AvgTickTime:Extended Read lcGetAvgTickTime;
End;

TWindowsTicker=Class(TTicker)
 Public
  Procedure Reset; Override;
  Procedure Tick(p_nCount:Integer=1); Override;
End;

TPerfomanceCounterTicker=Class(TTicker)
 Public
  Procedure Reset; Override;
  Procedure Tick(p_nCount:Integer=1); Override;
End;

Function CreateBestTicker:TTicker;

implementation
Uses
Windows;

Procedure TTicker.Tick;
Begin
 m_nLastTickValue:=m_nNowTickValue;
 m_nLastTickCount:=m_nTickCount;
 m_nTickCount:=m_nTickCount+p_nCount;
End;

Constructor TTicker.Create;
Begin
 Reset;
End;

Procedure TTicker.Reset;
Begin
 m_nLastTickValue:=m_nStartValue;
 m_nNowTickValue:=m_nStartValue;
 m_nLastTickCount:=0;
 m_nNowTickValue:=0;
 m_nTickCount:=0;
End;

Function TTicker.lcGetLastTickTime;
Begin
 If m_nFreq=0 Then Result:=0 Else
  If m_nLastTickCount=0 Then Result:=0 Else Result:=(m_nNowTickValue-m_nLastTickValue)/m_nFreq/m_nLastTickCount;
End;

Function TTicker.lcGetAllTime;
Begin
 If m_nFreq=0 Then Result:=0
              Else Result:=(m_nNowTickValue-m_nStartValue)/m_nFreq;
End;

Function TTicker.lcGetAvgTickTime;
Begin
 If m_nFreq=0 Then Result:=0 Else
 If m_nTickCount=0 Then Result:=0 Else Result:=(m_nNowTickValue-m_nLastTickValue)/m_nFreq/m_nTickCount;
End;

Procedure TWindowsTicker.Reset;
Begin
 m_nFreq:=1000;
 m_nStartValue:=GetTickCount;
 Inherited;
End;

Procedure TWindowsTicker.Tick;
Begin
 Inherited;
 m_nNowTickValue:=GetTickCount;
End;

Procedure TPerfomanceCounterTicker.Reset;
Begin
 QueryPerformanceFrequency(m_nFreq);
 QueryPerformanceCounter(m_nStartValue);
 Inherited;
End;

Procedure TPerfomanceCounterTicker.Tick;
Begin
 Inherited;
 QueryPerformanceCounter(m_nNowTickValue);
End;

Function CreateBestTicker:TTicker;
Var
n:Int64;
Begin
If Not QueryPerformanceFrequency(n) Then Result:=TWindowsTicker.Create
                                    Else Result:=TPerfomanceCounterTicker.Create;
End;

end.


 
TakTak   (2006-09-01 13:05) [6]

>>Fay
QueryPerfomanceCounter - а что это??? точнее к какой он библиотеке относится? хелп в дельфи результатов не дал


 
Fay ©   (2006-09-01 13:05) [7]

2 Palladin ©   (01.09.06 13:04) [5]
У меня есть вопрос : QueryPerformanceFrequency может давать разные значения на протяжении работы компа?


 
TakTak   (2006-09-01 13:07) [8]

>> Palladin

спасибо! первый способ очень подошел! :)


 
Palladin ©   (2006-09-01 13:09) [9]

Не должен иначе смысла он не имеет.


 
Palladin ©   (2006-09-01 13:11) [10]


> TakTak   (01.09.06 13:05) [6]

он относится к Windows SDK, и смотрится в соответствующей справке или в MSDN


 
Desdechado ©   (2006-09-01 13:32) [11]

> Now - показывает только секунды, миллисекунд нет
А ты вызови процедурку в цикле пару миллионов раз, а потом посчитай среднее...


 
TUser ©   (2006-09-01 13:51) [12]

> Now - показывает только секунды, миллисекунд нет

Есть они там.


 
Desdechado ©   (2006-09-01 13:53) [13]

TUser ©   (01.09.06 13:51) [12]
Есть, вот только точность у них хромает, до целой секунды :(


 
Anatoly Podgoretsky ©   (2006-09-01 19:30) [14]

Fay ©   (01.09.06 13:05) [7]
Может, не забывай про hibernate, изменение частоты процессора, многопроцессорные системы. Нет в компьютере ничего такого, что бы обеспечило стабильность и точность, только внешние таймеры, с автономным питанием.


 
DevilDevil ©   (2006-09-01 19:49) [15]

> Anatoly Podgoretsky ©   (01.09.06 19:30) [14]

Анатолий, какой на Ваш взгляд способ самый точный? С погрешностью хотя бы +/- 5 миллисекунды


 
Anatoly Podgoretsky ©   (2006-09-01 19:51) [16]

QueryPerfomanceCounter конечно. Точность один такт процессора, при условии что указаные мной ситуации не происходят и без учета приоритетов системы, точность повышается с количеством тактов.


 
Palladin ©   (2006-09-01 20:06) [17]


> [14] Anatoly Podgoretsky ©

мда, действительно, единственное что может все испортить это hybernate... но я думаю вряд ли кто то использующий ПО по измерению точных промежутков времени будет с дуру уходить в hibernate, потом с дуру менять частоту системной шины/процессора/чего либо еще, влияющего на hardware perfomance counter, а потом восстанавливать hybernate и обвинять разработчиков в фальсификации  :)


 
Anatoly Podgoretsky ©   (2006-09-01 20:09) [18]

Palladin ©   (01.09.06 20:06) [17]
Естественно, знаешь, значит подготовлен.
Данная функция самая точная из АПИ, в редких случаях на очень малых интервалах можно использовать RDTSC


 
Pavia ©   (2006-09-02 19:14) [19]


> QueryPerfomanceCounter конечно. Точность один такт процессора,
>  при условии что указаные мной ситуации не происходят и
> без учета приоритетов системы, точность повышается с количеством
> тактов.

Не согласен, система на выбор может использовать один из 4 таймеров/ счетчиков. Обычно самый точный. Да некоторые системы используют в качесте счетчика  RDTSC у которого точность один такт процессора. В других используется PM таймер у которого частота порядка 14МГц. QueryPerformanceFrequency - возращает частоту используемого таймера.


 
Pavia ©   (2006-09-02 19:28) [20]

И еще для PM таймера частота 14,31818МГц делется на 4 так что реально QueryPerformanceFrequency возращает значение 3579545


 
Пусик ©   (2006-09-02 21:31) [21]


> DevilDevil ©   (01.09.06 19:49) [15]


Наиболее точный способ измерения - функции GetThreadTimes и GetProcessTimes. Точность - 100 наносекунд.


 
Anatoly Podgoretsky ©   (2006-09-03 01:03) [22]

Pavia ©   (02.09.06 19:14) [19]
Естественно, но на современных процессорах я наблюдал только частоту процессора, то есть используется RDTSC,  и точность снизу ограничена потерями на вызов/возврат функции, если точность нужна меньше одной наносекунды то RDTSC, иначе хватит QueryPerfomanceCounter.
Два последовательных вызова QueryPerfomanceCounter покажут эти потери, которые если нужно, то можно и учесть.


 
Fay ©   (2006-09-03 03:40) [23]

2 Palladin ©   (01.09.06 20:06) [17]
А троллинг не влияет?



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

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

Наверх




Память: 0.52 MB
Время: 0.029 c
2-1157509534
O.O
2006-09-06 06:25
2006.09.24
Приложение на весь экран


2-1157444822
Jenny
2006-09-05 12:27
2006.09.24
C чего начать написания сетевой базы данных


10-1123768451
ragman
2005-08-11 17:54
2006.09.24
Передача массива внешнему приложению


2-1157286193
цунами
2006-09-03 16:23
2006.09.24
LongWord + DWord


10-1123726974
kblc
2005-08-11 06:22
2006.09.24
Связь с объектом