Мне говорили, что в API есть функция для измерения быстродейтсвия кода. Она принимает указатель на 32-битную переменную и после выполнения какого-то блока кода при повторном вызове (или вызове другой функции-спутника) в этой переменной оказывается значение, соответствующее быстродействию этого блока кода, т.е. чем больше значение, тем больше вкалывал процессор.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
27-05-2008 03:53
Ну не совсем. Это скорее сколько процессорного времени было отдано на обработку данного блока кода. Кроме того, на мультипроцессорных системах он может врать, поэтому рекоммендуется явно задавать Affinity Mask через SetThreadAffinityMask
Почитайте вопросы на Круглом Столе по поводу этой функции. Плюс есть что-то в статьях на эту тему, но не помню точно где
Вот несколько примеров по работе с QueryPerformanceCounter Как определить скорость процессора:
function RdTSC : int64; register;
asm
db $0f, $31
end;
function GetCyclesPerSecond : int64;
var
hF, T, et, sc : int64;
begin
QueryPerformanceFrequency(hF); // HiTicks / second
QueryPerformanceCounter(T); // Determine start HiTicks
et := T + hF; // (Cycles are passing, but we can still USE them!)
sc := RdTSC; // Get start cycles
repeat // Use Hi Perf Timer to loop for 1 second
QueryPerformanceCounter(T); // Check ticks NOW
until (T >= et); // Break the moment we equal or exceed et
Result := RdTSC - sc; // Get stop cycles and calculate result
end;
Высокоточный таймер
unit HRTimer;
interface
uses Windows;
type
THRTimer = class(TObject)
constructor Create;
function StartTimer: Boolean;
function ReadTimer: Double;
private
StartTime: Double;
ClockRate: Double;
public
Exists: Boolean;
end;
implementation
constructor THRTimer.Create;
var
QW: TLargeInteger;
begin
inherited Create;
Exists := QueryPerformanceFrequency(QW);
ClockRate := QW.QuadPart;
end;
function THRTimer.StartTimer: Boolean;
var
QW: TLargeInteger;
begin
Result := QueryPerformanceCounter(QW);
StartTime := QW.QuadPart;
end;
function THRTimer.ReadTimer: Double;
var
ET: TLargeInteger;
begin
QueryPerformanceCounter(ET);
Result := 1000.0 * (ET.QuadPart - StartTime) / ClockRate;
end;
end.
Авторство не мое, так что... извольте довольствоваться что есть;) Но может Вам пригодится!
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.