Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
ВнизСкорость алгоритма. Найти похожие ветки
← →
Б (2009-06-19 12:10) [0]Как максимально точно скорость алгоритма? (Графики и т.п.)
До этого пользовался GetTickCount, но он выдаёт приближённый результат.
← →
Б (2009-06-19 12:11) [1]* Как максимально точно определить скорость алгоритма.
← →
Palladin © (2009-06-19 12:15) [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.
← →
Palladin © (2009-06-19 12:17) [3]Удалено модератором
Примечание: дубль
← →
Ega23 © (2009-06-19 12:20) [4]
> До этого пользовался GetTickCount, но он выдаёт приближённый
> результат.
Через SystemTime можно попробовать, там, судя по декларации, дискрет - 100 наносекунд.
← →
Loginov Dmitry © (2009-06-19 12:21) [5]
> До этого пользовался GetTickCount, но он выдаёт приближённый
> результат.
А что если прогнать данный участок N раз вподряд, запомнить общее время, затем разделить его на N. Получится относительно адекватный результат.
← →
AndreyV © (2009-06-19 18:12) [6]Я чёт не пойму. Как можно получить результат измерения точнее, чем позволяет измерительный инструмент. только инструмент менять. При использовании инструмента любой точноти расчитывать среднее и отклонение из статистики многих замеров.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c