Категорија :
QueryPerformanceCounter (QPC) је функција у Windows API-ју која се користи за мјерење врло прецизних временских интервала.QueryPerformanceFrequency, омогућава корисницима да добију високу прецизност у мјерењу времена, што је корисно за профилисање перформанси апликација. QPC се често користи за временско означавање догађаја и мјерење малих временских интервала унутар истог система или виртуелне машине.QueryPerformanceFrequency омогућава корисницима да добију високу прецизност у мјерењу времена, што је корисно за профилисање перформанси апликација. QPC се често користи за временско означавање догађаја и мјерење малих временских интервала унутар истог система или виртуелне машине.
uses
Windows, SysUtils;
var
Frequency, StartCounter, EndCounter: Int64;
ElapsedTime: Double;
begin
// Dobijanje frekvencije visoko preciznog tajmera
if QueryPerformanceFrequency(Frequency) then
begin
// Mjerenje vremena
QueryPerformanceCounter(StartCounter);
// Ovdje dodajte kod koji želite mjeriti, na primer:
Sleep(1000); // Simulira proces koji traje 1 sekundu
QueryPerformanceCounter(EndCounter);
// Izračunavanje proteklog vremena u sekundama
ElapsedTime := (EndCounter - StartCounter) / Frequency;
// Prikaz rezultata
Writeln(Format('Proteklu vreme: %.6f sekundi', [ElapsedTime]));
end
else
begin
Writeln(‘Sistem ne podržava funkciju
QueryPerformanceFrequency.’);
end;
Readln; // Čekanje na unos
end.
Windows se koristi za pristup funkcijama Windows API-ja.QueryPerformanceFrequency(Frequency) postavlja varijablu Frequency sa frekvencijom tajmera u Hertzima. Ako funkcija vrati True, sistem podržava ovu funkcionalnost.QueryPerformanceCounter se koristi da zabeleži vreme pre i posle izvršavanja nekog bloka koda. Rezultati su u jedinicama koje zavise od frekvencije.EndCounter i StartCounter podeljena sa Frequency daje vreme u sekundama.Writeln da prikažemo proteklo vreme.Овај код ће приказати колико је времена протекло у секунди за одређене операције које сте одабрали. Можете га прилагодити према вашим потребама за мјерење перформанси.
QueryPerformanceCounter – преузима тренутну вриједност бројача перформанси, што је временска ознака високе резолуције (<1us) која се може користити за мерења временског интервала. QueryPerformanceFrequency – Преузима фреквенцију бројача перформанси. Учесталост бројача перформанси је фиксна при покретању система и конзистентна је на свим процесорима. Зато је потребно да захтјевате фреквенцију само након иницијализације апликације, а резултат се може кеширати. Да бисмо користили ове функције за бројање временског интервала потребног за извршење било које операције у Delphi-ју, потребно је да уредимо изворни код, на примјер, на следећи начин:
var iCounterPerSec: TLargeInteger; T1, T2: TLargeInteger; //counter value BEFORE and AFTER the operation begin QueryPerformanceFrequency(iCounterPerSec);//determine the frequency of the counter QueryPerformanceCounter(T1); //mark the start of the operation DoSomething; //execute the operation QueryPerformanceCounter(T2);//mark the end of the operation ShowMessage(FormatFloat(‘0.0000’, (T2 – T1)/iCounterPerSec) + ‘ сек.’);//show the required number of seconds to complete the operation end;
Можете да радите са добијеним вриједностима Т1 и Т2 како желите, на примјер, можете засебно приказати минуте / секунде / милисекунде итд. Ово зависи од ваших потреба и жеља. У овом чланку сам показао најједноставнији примјер коришћења бројача високе резолуције у Delphi-ју. Модул System.Diagnosticsје уведен у Delphi прилично давно. Модул обезбjеђује само један запис – TStopwatch. То је у суштини згодан „омот“ за коришћење тајмера високе резолуције у вашим апликацијама на више платформи. TStopwatchкористи функционалност која зависи од оперативног система за приступ тајмерима високе резолуције ако су доступни. Ако тајмери високе резолуције нису доступни у ОС, користе се уобичајени тајмери. Иако TStopwatchје запис, и даље морате да позовете методу Create или StartNev да бисте је правилно користили. Опис TStopwatchје следећи:
TStopwatch = record
strict private
class var FFrequency: Int64;
class var FIsHighResolution: Boolean;
class var TickFrequency: Double;
strict private FElapsed: Int64;
FRunning: Boolean;
FStartTimeStamp: Int64;
function GetElapsed: TTimeSpan;
function GetElapsedDateTimeTicks: Int64;
function GetElapsedMilliseconds: Int64;
function GetElapsedTicks: Int64;
class procedure InitStopwatchType; static;
public class function Create:
TStopwatch; static;
class function GetTimeStamp: Int64; static;
procedure Reset;
procedure Start;
class function StartNew: TStopwatch; static;
procedure Stop;
property Elapsed: TTimeSpan read GetElapsed;
property ElapsedMilliseconds: Int64 read GetElapsedMilliseconds;
property ElapsedTicks: Int64 read GetElapsedTicks;
class property Frequency: Int64 read FFrequency;
class property IsHighResolution: Boolean read FIsHighResolution;
property IsRunning: Boolean read FRunning;
end;
IsHighResolution одређује да ли је тајмер заснован на бројачу перформанси високе резолуције.Start() почиње да мери протекло време.Stop() престаје да мери протекло време.ElapsedMilliseconds добија укупно протекло време у милисекундама.Elapsed добија протекло време у облику TTimeSpan.uses System.Diagnostics; … var SW: TStopwatch; begin SW:=TStopwatch.StartNew; SW.Start; DoSomething; SW.Stop; ShowMessage(SW.Elapsed.TotalMinutes.ToString); end;
Delphi-ју, прије свега, морате да одлучите која прецизност вам одговара:
Now () функцију. Да, тачност је најнижа, али, с друге стране, овај метод је апсолутно једноставан.GetTickCount() која је једноставна и поуздана, али само ако не планирате да мјерите временски интервал који ће бити дужи од 49,7 дана.QueryPerformanceCounter()и QueryPerformanceFrequency() .TStopwatchу System.Diagnosticsмодулу. Ово је најпогодније за апликације на више платформи јер ради на било чему укључујући Windows, Linux, Android и macOS.Преузето са :
Аутор :
Драшко Шикањић
01. 09. 2024.