Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

время работы в миллисекундах. [D7, XP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо