Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.038 c
2-1157130201
nordic3
2006-09-01 21:03
2006.09.24
Код цвета


15-1157541710
Nic
2006-09-06 15:21
2006.09.24
Выбор вклада в Сбербанке


15-1157452753
rerfhtre
2006-09-05 14:39
2006.09.24
tcpdump: dmp files


4-1148406407
Донской
2006-05-23 21:46
2006.09.24
Двухголовая машина


1-1155530058
dellam
2006-08-14 08:34
2006.09.24
Resize





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