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

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

Скорость алгоритма. [D6, XP]


Б ©   (2009-06-19 12:10:00) 

Как максимально точно скорость алгоритма? (Графики и т.п.)
До этого пользовался GetTickCount, но он выдаёт приближённый результат.


AndreyV   (2009-06-19 18:12:00) [1]

Я чёт не пойму. Как можно получить результат измерения точнее, чем позволяет измерительный инструмент. только инструмент менять. При использовании инструмента любой точноти расчитывать среднее и отклонение из статистики многих замеров.


Loginov Dmitry   (2009-06-19 12:21:00) [2]


> До этого пользовался GetTickCount, но он выдаёт приближённый
> результат.


А что если прогнать данный участок N раз вподряд, запомнить общее время, затем разделить его на N. Получится относительно адекватный результат.


Ega23   (2009-06-19 12:20:00) [3]


> До этого пользовался GetTickCount, но он выдаёт приближённый
> результат.


Через SystemTime можно попробовать, там, судя по декларации, дискрет - 100 наносекунд.


Palladin   (2009-06-19 12:17:00) [4]

Удалено модератором
Примечание: дубль


Palladin   (2009-06-19 12:15:00) [5]

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.


Б   (2009-06-19 12:11:00) [6]

* Как максимально точно определитьскорость алгоритма.


Наверх

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