![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
время работы в миллисекундах. [D7, XP]
TakTak © (2006-09-01 12:58:00)есть процедурка. мне нужно определить сколько миллисекунд ей понадобилось на работу. Как сделать??? обычный таймер на сколько я знаю с такой точностью (1-25 мс) работать не умеет.
Fay (2006-09-03 03:40:00) [1]2 Palladin © (01.09.06 20:06) [17]
А троллинг не влияет?
Anatoly Podgoretsky (2006-09-03 01:03:00) [2]Pavia © (02.09.06 19:14) [19]
Естественно, но на современных процессорах я наблюдал только частоту процессора, то есть используется RDTSC, и точность снизу ограничена потерями на вызов/возврат функции, если точность нужна меньше одной наносекунды то RDTSC, иначе хватит QueryPerfomanceCounter.
Два последовательных вызова QueryPerfomanceCounter покажут эти потери, которые если нужно, то можно и учесть.
Пусик (2006-09-02 21:31:00) [3]
> DevilDevil © (01.09.06 19:49) [15]
Наиболее точный способ измерения - функции GetThreadTimes и GetProcessTimes. Точность - 100 наносекунд.
Pavia (2006-09-02 19:28:00) [4]И еще для PM таймера частота 14,31818МГц делется на 4 так что реально QueryPerformanceFrequency возращает значение 3579545
Pavia (2006-09-02 19:14:00) [5]
> QueryPerfomanceCounter конечно. Точность один такт процессора,
> при условии что указаные мной ситуации не происходят и
> без учета приоритетов системы, точность повышается с количеством
> тактов.
Не согласен, система на выбор может использовать один из 4 таймеров/ счетчиков. Обычно самый точный. Да некоторые системы используют в качесте счетчика RDTSC у которого точность один такт процессора. В других используется PM таймер у которого частота порядка 14МГц. QueryPerformanceFrequency - возращает частоту используемого таймера.
Anatoly Podgoretsky (2006-09-01 20:09:00) [6]Palladin © (01.09.06 20:06) [17]
Естественно, знаешь, значит подготовлен.
Данная функция самая точная из АПИ, в редких случаях на очень малых интервалах можно использовать RDTSC
Palladin (2006-09-01 20:06:00) [7]
> [14] Anatoly Podgoretsky ©
мда, действительно, единственное что может все испортить это hybernate... но я думаю вряд ли кто то использующий ПО по измерению точных промежутков времени будет с дуру уходить в hibernate, потом с дуру менять частоту системной шины/процессора/чего либо еще, влияющего на hardware perfomance counter, а потом восстанавливать hybernate и обвинять разработчиков в фальсификации :)
Anatoly Podgoretsky (2006-09-01 19:51:00) [8]QueryPerfomanceCounter конечно. Точность один такт процессора, при условии что указаные мной ситуации не происходят и без учета приоритетов системы, точность повышается с количеством тактов.
DevilDevil (2006-09-01 19:49:00) [9]> Anatoly Podgoretsky © (01.09.06 19:30) [14]
Анатолий, какой на Ваш взгляд способ самый точный? С погрешностью хотя бы +/- 5 миллисекунды
Anatoly Podgoretsky (2006-09-01 19:30:00) [10]Fay © (01.09.06 13:05) [7]
Может, не забывай про hibernate, изменение частоты процессора, многопроцессорные системы. Нет в компьютере ничего такого, что бы обеспечило стабильность и точность, только внешние таймеры, с автономным питанием.
Desdechado (2006-09-01 13:53:00) [11]TUser © (01.09.06 13:51) [12]
Есть, вот только точность у них хромает, до целой секунды :(
TUser (2006-09-01 13:51:00) [12]> Now - показывает только секунды, миллисекунд нет
Есть они там.
Desdechado (2006-09-01 13:32:00) [13]> Now - показывает только секунды, миллисекунд нет
А ты вызови процедурку в цикле пару миллионов раз, а потом посчитай среднее...
Palladin (2006-09-01 13:11:00) [14]
> TakTak (01.09.06 13:05) [6]
он относится к Windows SDK, и смотрится в соответствующей справке или в MSDN
Palladin (2006-09-01 13:09:00) [15]Не должен иначе смысла он не имеет.
TakTak (2006-09-01 13:07:00) [16]>> Palladin
спасибо! первый способ очень подошел! :)
Fay (2006-09-01 13:05:00) [17]2 Palladin © (01.09.06 13:04) [5]
У меня есть вопрос : QueryPerformanceFrequency может давать разные значения на протяжении работы компа?
TakTak (2006-09-01 13:05:00) [18]>>Fay
QueryPerfomanceCounter - а что это??? точнее к какой он библиотеке относится? хелп в дельфи результатов не дал
Palladin (2006-09-01 13:04:00) [19]способ 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:03:00) [20]>>Desdechado
Now - показывает только секунды, миллисекунд нет, соответственно, говорит что время работы = 0