Χρονόμετρο υψηλής απόδοσης στους Δελφούς

Για συνήθεις εφαρμογές βάσεων δεδομένων επιφάνειας εργασίας, η προσθήκη ενός δευτερολέπτου στο χρόνο εκτέλεσης μιας εργασίας σπάνια κάνει τη διαφορά στους τελικούς χρήστες - αλλά όταν χρειάζεται να επεξεργαστείτε εκατομμύρια φύλλα δέντρων ή να δημιουργήσετε δισεκατομμύρια μοναδικούς τυχαίους αριθμούς, η ταχύτητα εκτέλεσης γίνεται πιο σημαντική.

Διαγραφή του κώδικα σας

Σε ορισμένες εφαρμογές, πολύ ακριβείς μέθοδοι μέτρησης του χρόνου υψηλής ακρίβειας είναι σημαντικές και ευτυχώς Δελφοί παρέχει έναν μετρητή υψηλής απόδοσης για να πληροί τις προϋποθέσεις αυτές.

Χρησιμοποιώντας RTL Τώρα Λειτουργία

Μια επιλογή χρησιμοποιεί το Τώρα λειτουργία. Τώρα, που ορίζονται στο SysUtils μονάδα, επιστρέφει την τρέχουσα ημερομηνία και ώρα του συστήματος.

Λίγα γραμμικά μέτρα μέτρησης κώδικα έχουν παρέλθει μεταξύ της "έναρξης" και της "διακοπής" κάποιας διαδικασίας:

Η λειτουργία Τώρα επιστρέφει την τρέχουσα ημερομηνία και ώρα συστήματος που είναι ακριβή μέχρι 10 χιλιοστά του δευτερολέπτου (Windows NT και νεότερη έκδοση) ή 55 χιλιοστά του δευτερολέπτου (Windows 98).

instagram viewer

Για πολύ μικρά χρονικά διαστήματα, η ακρίβεια του "Τώρα" δεν είναι μερικές φορές αρκετή.

Χρησιμοποιώντας το Windows API GetTickCount

Για ακόμα πιο ακριβή δεδομένα, χρησιμοποιήστε το GetTickCountAPI των Windows λειτουργία. GetTickCount ανακτά τον αριθμό των χιλιοστών του δευτερολέπτου που έχουν περάσει από την εκκίνηση του συστήματος, αλλά η λειτουργία έχει μόνο η ακρίβεια 1 ms και ίσως να μην είναι πάντα ακριβής αν ο υπολογιστής παραμένει αναμμένος για μεγάλο χρονικό διάστημα χρόνος.

Ο χρόνος που έχει παρέλθει αποθηκεύεται ως τιμή DWORD (32 bit). Επομένως, ο χρόνος θα τυλιχτεί γύρω στο μηδέν εάν τα Windows λειτουργούν συνεχώς για 49,7 ημέρες.

GetTickCount περιορίζεται επίσης στην ακρίβεια του χρονομέτρου συστήματος (10/55 ms).

Υψηλή ακρίβεια χρονομέτρησης του κώδικα σας

Εάν ο υπολογιστής σας υποστηρίζει μετρητή επιδόσεων υψηλής ανάλυσης, χρησιμοποιήστε το QueryPerformanceFrequency Το API των Windows λειτουργεί για να εκφράσει τη συχνότητα, σε μετρήσεις ανά δευτερόλεπτο. Η τιμή της μέτρησης εξαρτάται από τον επεξεργαστή.

ο QueryPerformanceCounter λειτουργία ανακτά την τρέχουσα τιμή του μετρητή επιδόσεων υψηλής ανάλυσης. Καλώντας αυτή τη λειτουργία στην αρχή και στο τέλος μιας ενότητας κώδικα, μια εφαρμογή χρησιμοποιεί τον μετρητή ως χρονόμετρο υψηλής ανάλυσης.

Η ακρίβεια των χρονιστών υψηλής ανάλυσης είναι περίπου μερικές εκατοντάδες νανοδευτερόλεπτα. Ένα νανοδευτερόλεπτο είναι μια μονάδα χρόνου που αντιπροσωπεύει 0.000000001 δευτερόλεπτα - ή 1 δισεκατομμύριο δευτερολέπτου.

TStopWatch: Delphi Εφαρμογή μετρητή υψηλής ανάλυσης

Με ένα νεύμα σε .Net συμβάσεις ονομασίας, ένας μετρητής σαν TStopWatch προσφέρει μια λύση Delphi υψηλής ανάλυσης για ακριβείς μετρήσεις χρόνου.

Το TStopWatch μετράει το χρονικό διάστημα που μετράει με την καταμέτρηση των χρονομετρητών στο βασικό μηχανισμό χρονοδιακόπτη.

  • ο IsHighResolution ιδιότητα υποδηλώνει εάν ο χρονομετρητής βασίζεται σε μετρητή επιδόσεων υψηλής ανάλυσης.
  • ο Αρχή η μέθοδος αρχίζει να μετράει το παρελθόν.
  • ο Να σταματήσει η μέθοδος σταματά τη μέτρηση του χρόνου που έχει παρέλθει.
  • ο Έχουν περάσει εκατομμύρια δευτερόλεπτα η ιδιότητα παίρνει το συνολικό χρόνο που πέρασε σε χιλιοστά του δευτερολέπτου.
  • ο Παρήλθε η ιδιοκτησία παίρνει το συνολικό χρόνο που έχει περάσει στα χρονομετρημένα χτυπήματα.

Ακολουθεί ένα παράδειγμα χρήσης: