Како одредити временски интервал у Delphi-ју

  • QueryPerformanceCounter (QPC) је функција у Windows API-ју која се користи за мјерење врло прецизних временских интервала.
    У комбинацији са QueryPerformanceFrequency, омогућава корисницима да добију високу прецизност у мјерењу времена, што је корисно за профилисање перформанси апликација. QPC се често користи за временско означавање догађаја и мјерење малих временских интервала унутар истог система или виртуелне машине.
    QueryPerformanceFrequency омогућава корисницима да добију високу прецизност у мјерењу времена, што је корисно за профилисање перформанси апликација. QPC се често користи за временско означавање догађаја и мјерење малих временских интервала унутар истог система или виртуелне машине.
    Препоручује се да провјерите тачност резултата, јер мјерења добијена путем 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.
    

    Objašnjenje Koda

    1. Uključivanje modula: Modul Windows se koristi za pristup funkcijama Windows API-ja.
    2. FrekvencijaQueryPerformanceFrequency(Frequency) postavlja varijablu Frequency sa frekvencijom tajmera u Hertzima. Ako funkcija vrati True, sistem podržava ovu funkcionalnost.
    3. Merenje vremenaQueryPerformanceCounter se koristi da zabeleži vreme pre i posle izvršavanja nekog bloka koda. Rezultati su u jedinicama koje zavise od frekvencije.
    4. Izračunavanje proteklog vremena: Razlika između EndCounter i StartCounter podeljena sa Frequency daje vreme u sekundama.
    5. Prikazivanje rezultata: Koristimo 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.

Leave a Reply

Your email address will not be published. Required fields are marked *