λογισμικό

Γνώση Υπολογιστών >> λογισμικό >  >> Quicktime

Πώς μπορώ να εφαρμόσω ένα χρονοδιακόπτη στο Fortran για να μετρήσω τον χρόνο εκτέλεσης του προγράμματος μου;

Το FORTRAN προσφέρει διάφορους τρόπους για την εφαρμογή ενός χρονοδιακόπτη για τη μέτρηση του χρόνου εκτέλεσης. Η καλύτερη προσέγγιση εξαρτάται από τις ανάγκες σας για ακρίβεια και φορητότητα. Εδώ είναι τρεις κοινές μέθοδοι:

1. Χρησιμοποιώντας την ενδογενή συνάρτηση CPU_TIME` (απλούστερη, αλλά λιγότερο ακριβή):

Αυτή είναι η ευκολότερη μέθοδος, χτισμένη απευθείας στο Fortran. `Cpu_time` επιστρέφει τον χρόνο επεξεργαστή που χρησιμοποιείται από το πρόγραμμα από την έναρξη του σε δευτερόλεπτα. Είναι γενικά λιγότερο ακριβές από άλλες μεθόδους, ιδιαίτερα σε συστήματα πολλαπλών πυρήνων, όπου μπορεί να μην αντικατοπτρίζουν τον πραγματικό χρόνο τοίχου.

`` `Fortran

Πρόγραμμα χρονομέτρησης_example

κανένας

real ::start_time, end_time, elapsed_time

Καλέστε το CPU_TIME (start_time)

! Ο κωδικός σας για να είναι χρονομετρημένος πηγαίνει εδώ

! ... μακροχρόνιοι υπολογισμοί ...

Καλέστε το CPU_TIME (end_time)

elapsed_time =end_time - start_time

Εκτύπωση *, "Πέρα από την ώρα CPU:", Elapsed_time, "Seconds"

end πρόγραμμα χρονομέτρησης_example

`` `

2. Χρησιμοποιώντας την ενδογενή υπορουτίνα `system_clock` (πιο ακριβή, εξαρτώμενη από την πλατφόρμα):

Το `system_clock` παρέχει περισσότερο έλεγχο και ενδεχομένως υψηλότερη ακρίβεια. Σας επιτρέπει να καθορίσετε τις μονάδες του χρόνου που επιστρέφεται (π.χ. δευτερόλεπτα, χιλιοστά του δευτερολέπτου, μικροδευτερόλεπτα). Ωστόσο, οι διαθέσιμες μονάδες και η ακρίβεια εξαρτώνται από το σύστημα.

`` `Fortran

Πρόγραμμα timing_example_system_clock

κανένας

Ακέραιος, Παράμετρος ::count_rate =1000! Ποσοστό μέτρησης σε χιλιοστά του δευτερολέπτου

ακέραιος ::start_count, end_count, elapsed_count

Real ::Elapsed_time

Κλήση System_Clock (start_count, count_rate)

! Ο κωδικός σας για να είναι χρονομετρημένος πηγαίνει εδώ

! ... μακροχρόνιοι υπολογισμοί ...

Κλήση System_Clock (end_count, count_rate)

elapsed_count =end_count - start_count

elapsed_time =real (elapsed_count) / real (count_rate)

Εκτύπωση *, "Χρόνος που έχει περάσει:", Elapsed_time, "δευτερόλεπτα"

ΤΕΛΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΧΡΟΝΟΠΟΙΗΣΗ_EXAMPLE_SYSTEM_CLOCK

`` `

3. Χρησιμοποιώντας βιβλιοθήκες συγκεκριμένης πλατφόρμας (πιο ακριβή, λιγότερο φορητά):

Για την υψηλότερη ακρίβεια και τις ακριβέστερες μετρήσεις τοίχου του ρολογιού, ίσως χρειαστεί να διασυνδέετε με βιβλιοθήκες που σχετίζονται με το λειτουργικό σύστημα. Αυτή η προσέγγιση είναι λιγότερο φορητή επειδή ο κώδικας θα χρειαστεί προσαρμογές για διαφορετικά συστήματα (Linux, Windows, MacOS).

* Linux (χρησιμοποιώντας το `gettimeOfday '): Θα χρειαστεί να δηλώσετε μια διεπαφή στη λειτουργία `getTimeOfday 'από το αρχείο κεφαλίδας` `. Αυτό περιλαμβάνει τη χρήση της ενότητας `iso_c_binding` και του προσεκτικού χειρισμού τύπου. Παράδειγμα (απαιτεί χειρισμό σφαλμάτων για κωδικό παραγωγής):

`` `Fortran

Πρόγραμμα Timing_Example_GettimeOfday

Χρησιμοποιήστε το ISO_C_BINDING

κανένας

Συμπεριλάβετε το 'TIME.h' // ή χρησιμοποιήστε μια κατάλληλη εναλλακτική λύση για τον μεταγλωττιστή σας. Ορισμένοι μεταγλωττιστές δεν απαιτούν ρητή περιλαμβάνουν.

Τύπος (C_PTR) ::TV

ακέραιος (C_INT) ::RC

Διπλή ακρίβεια ::Start_Time, End_time, Elapsed_time

κατανομή (τηλεόραση)

rc =c_gettimeofday (τηλεόραση, c_null_ptr)! Λάβετε χρόνο έναρξης

start_time =c_f_double (c_loc (tv)%Ώρα) + c_f_double (c_loc (tv)%tv_sec)

! Ο κωδικός σας για να είναι χρονομετρημένος πηγαίνει εδώ

! ... μακροχρόνιοι υπολογισμοί ...

rc =c_gettimeofday (τηλεόραση, c_null_ptr)! Λάβετε το τέλος

end_time =c_f_double (c_loc (tv)%Ώρα) + c_f_double (c_loc (tv)%tv_sec)

deallocate (τηλεόραση)

elapsed_time =end_time - start_time

Εκτύπωση *, "Χρόνος που έχει περάσει:", Elapsed_time, "δευτερόλεπτα"

ΤΕΛΙΚΟ ΠΡΟΓΡΑΜΜΑΤΟΣ ΠΡΟΓΡΑΜΜΑ_EXAMPLE_GETTIMEOFDAY

`` `

Θυμηθείτε να συντάξετε με τις κατάλληλες σημαίες για σύνδεση με τις απαραίτητες βιβλιοθήκες (π.χ. `-lrt` για` gettimeofday 'στο Linux). Η εντολή ακριβούς συλλογής εξαρτάται από τον μεταγλωττιστή σας (Gfortran, Ifort κ.λπ.).

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

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα