Текущий архив: 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.5 MB
Время: 0.055 c