Maraqlıdır

Delphi Performans Sayğacından istifadə edərək vaxtı dəqiqliklə ölçün

Delphi Performans Sayğacından istifadə edərək vaxtı dəqiqliklə ölçün

Gündəlik masa üstü verilənlər bazası tətbiqetmələri üçün, bir tapşırığın icra müddətinə bir saniyə əlavə etmək son istifadəçilər üçün nadir hallarda bir fərq yaradır - lakin milyonlarla ağac yarpağı emal etmək və ya milyardlarla misilsiz təsadüfi ədəd yaratmaq lazım olduqda, icra sürəti daha vacib olur.

Kodunuzun vaxtı

Bəzi tətbiqlərdə çox dəqiq, yüksək dəqiqlikli vaxt ölçmə metodları vacibdir və xoşbəxtlikdən Delphi bu dəfə uyğunlaşmaq üçün yüksək səviyyəli bir sayğac təmin edir.

RTL istifadə İndiFunksiya

Bir seçim Now funksiyasından istifadə edir. İndi, olan müəyyən SysUtils vahid, cari sistem tarixi və vaxtını qaytarır.

Bəzi prosesin "başlanğıc" və "dayanması" arasında bir neçə kod ölçü xətti keçdi:

var

başlamaq, dayandırmaq, keçmək: TDateTime;

başlamaq

başla: = İndi;

// TimeOutThis ();

dayan: = İndi;

keçdi: = dayandırmaq - başlamaq;

son;

İndi funksiya 10 millisekund (Windows NT və daha sonra) və ya 55 millisaniyədə (Windows 98) dəqiq olan cari sistem tarixini və vaxtını qaytarır.

Çox kiçik fasilələrlə bəzən "İndi" dəqiqliyi kifayət etmir.

Windows API GetTickCount istifadə

Daha dəqiq məlumat üçün, istifadə edin GetTickCount Windows API funksiyası. GetTickCount Sistem başlandıqdan bəri keçən millisaniyəlik sayını alır, ancaq funksiya yalnız 1 ms dəqiqliyə malikdir və kompüter uzun müddət güclə qalırsa həmişə düzgün olmaya bilər.

Keçən vaxt DWORD (32-bit) dəyəri olaraq saxlanılır. Buna görə Windows 49,7 gün davamlı işlədiyi təqdirdə vaxt sıfıra yaxınlaşacaq.

var

başlamaq, dayandırmaq, keçmək: kardinal;

başlamaq

başlanğıc: = GetTickCount;

// TimeOutThis ();

dayandırmaq: = GetTickCount;

keçdi: = dayandırmaq - başlamaq; // millisekund;

GetTickCount sistem taymerinin dəqiqliyi ilə də məhduddur (10/55 ms).

Kodunuzu Yüksək Həssaslıq Zamanı

PC yüksək qətnamə performans sayğacını dəstəkləyirsə, istifadə edin QueryPerformanceFrequency Sürəti ifadə etmək üçün Windows API funksiyası saniyədə sayılır. Sayının dəyəri prosessordan asılıdır.

The QueryPerformanceCounter funksiya yüksək qətnamə performans tezgahının cari dəyərini alır. Bu funksiyanı kodun bir hissəsinin əvvəlində və sonunda çağıraraq bir tətbiq sayğacı yüksək qətnamə taymer kimi istifadə edir.

Yüksək qətnamə sayğaclarının dəqiqliyi bir neçə yüz nanosaniyədir. Bir nanosekund 0.000000001 saniyəni və ya saniyənin 1 milyarddan birini təmsil edən vaxt vahididir.

TStopWatch: yüksək qətnamə sayğacın Delphi tətbiqi

Bir nod ilə .Net adlandırma konvensiyaları kimi bir sayğac TStopWatch dəqiq vaxt ölçmələri üçün yüksək qətnaməli Delphi həllini təklif edir.

TStopWatch ölçüləri əsas timer mexanizmindəki timer gənələrini saymaqla keçir.

  • The IsHighResolution əmlak, timerin yüksək qətnamə bir performans sayğacına əsaslandığını göstərir.
  • The Başlamaq metod, keçən vaxtı ölçməyə başlayır.
  • The Dayan metod, keçən vaxtı ölçməyi dayandırır.
  • The KeçmişMillisekundlar əmlak ümumi keçən vaxtı millisaniyədə əldə edir.
  • The Keçdi əmlak timer gənələrindəki ümumi vaxtı alır.

vahid StopWatch;

interfeysi

istifadə edir Windows, SysUtils, DateUtils;

növü TStopWatch = sinif

  özəl

fFrequency: TLargeInteger;

fIsRunning: boolean;

fİsHighResolution: boolean;

fStartCount, fStopCount: TLargeInteger;

    proseduru SetTickStamp (var lİnt: TLargeInteger);
    

funksiyası GetElapsedTicks: TLargeInteger;
    

funksiyası GetElapsedMilliseconds: TLargeInteger;
    

funksiyası GetElapsed: simli;
  

ictimai

    konstruktor Yarat (const startOnCreate: boolean = yalan);
    

proseduru Başlamaq;
    

proseduru Dayan;
    

əmlak IsHighResolution: boolean oxumaq fİsHighResolution;
    

əmlak Keçən işarələr: TLargeInteger oxumaq GetElapsedTicks;
    

əmlak KeçmişMillisekundlar: TLargeInteger oxumaq GetElapsedMilliseconds;
    

əmlak Keçdi: simli oxumaq GetElapsed;
    

əmlak IsRunning: boolean oxumaq fIsRunning;
  

son;

həyata keçirilməsi

konstruktor TStopWatch.Create (const startOnCreate: boolean = yalan);

başlamaq

irsi Yarat;

fIsRunning: = saxta;

fIsHighResolution: = QueryPerformanceFrequency (fFrequency);

  Əgər olmasa fİsHighResolution sonra fFrequency: = MSecsPerSec;
  

əgər startOnCreate sonra Başlamaq;

son;

funksiyası TStopWatch.GetElapsedTicks: TLargeInteger;

başlamaq

nəticə: = fStopCount - fStartCount;

son;

proseduru TStopWatch.SetTickStamp (var lİnt: TLargeInteger);

başlamaq

  əgər fİsHighResolution sonra

QueryPerformanceCounter (lInt)

başqa

lİnt: = MilliSecondOf (İndi);

son;

funksiyası TStopWatch.Get Alındı: simli;

var

dt: TDateTime;

başlamaq

dt: = ElapsedMilliseconds / MSecsPerSec / SecsPerDay;

nəticə: = Format ('% d gün,% s', trunc (dt), FormatDateTime ('hh: nn: ss.z', Frac (dt)));

son;

funksiyası TStopWatch.GetElapsedMilliseconds: TLargeInteger;

başlamaq

nəticə: = (MSecsPerSec * (fStopCount - fStartCount)) div fFrequency;

son;

proseduru TStopWatch.Start;

başlamaq

SetTickStamp (fStartCount);

fIsRunning: = doğrudur;

son;

proseduru TStopWatch.Stop;

başlamaq

SetTickStamp (fStopCount);

fIsRunning: = saxta;

son;

son.

İstifadə nümunəsi:

var

sw: TStopWatch;

keçdiMilliseconds: kardinal;

başlamaq

sw: = TStopWatch.Create ();

  cəhd edin

sw.Start;

    // TimeOutThisFunction ()

sw.Stop;

keçdiMillisecundlar: = dəyişdiMilliseconds;

  nəhayət

sərbəst;

  son;

son;