Fortran bietet verschiedene Möglichkeiten, einen Timer zu implementieren, um die Ausführungszeit zu messen. Der beste Ansatz hängt von Ihren Anforderungen an Präzision und Portabilität ab. Hier sind drei gemeinsame Methoden:
1. Verwenden der intrinsischen Funktion `cpu_time` (einfachste, aber weniger präzise):
Dies ist die einfachste Methode, die direkt in Forran eingebaut ist. `Cpu_time` gibt die von dem Programm seit seinem Start in Sekunden verwendete Prozessorzeit zurück. Es ist im Allgemeinen weniger präzise als andere Methoden, insbesondere bei Multi-Core-Systemen, bei denen es möglicherweise nicht die echte Wandverrückungszeit widerspiegelt.
`` `fortran
Programm Timing_example
implizit keine
Real ::start_time, end_time, leftsed_time
Rufen Sie cpu_time an (start_time)
! Ihr zu zeitgesteuerter Code geht hier
! ... lange Berechnungen ...
Rufen Sie cpu_time (end_time) auf
leftsed_time =end_time - start_time
Drucken *, "verstrichene CPU -Zeit:", rotsed_time, "Sekunden"
Endprogramm Timing_example
`` `
2. Verwenden Sie die intrinsische Subroutine `system_clock` (präzise, plattformabhängig):
`System_clock` bietet mehr Kontrolle und potenziell höhere Genauigkeit. Sie können die Einheiten der zurückgegebenen Zeit angeben (z. B. Sekunden, Millisekunden, Mikrosekunden). Die verfügbaren Einheiten und Präzision sind jedoch systemabhängig.
`` `fortran
Programm Timing_example_System_Clock
implizit keine
Ganzzahl, Parameter ::count_rate =1000! Zählrate in Millisekunden
INTEGER ::START_COUNT, ENGE_COUNT, ELAPSED_COUNT
Real ::leftsed_time
Rufen Sie System_clock auf (start_count, count_rate)
! Ihr zu zeitgesteuerter Code geht hier
! ... lange Berechnungen ...
Rufen Sie system_clock (end_count, count_rate) auf
leftsed_count =end_count - start_count
leftsed_time =real (leftsed_count) / real (count_rate)
Drucken *, "Verstrichene Zeit:", verkleinerte_Time, "Sekunden"
Endprogramm Timing_example_System_Clock
`` `
3. Verwenden plattformspezifischer Bibliotheken (genaueste, am wenigsten tragbar):
Für die höchste Präzision und die genauesten Messungen der Wandverrückungszeit müssen Sie möglicherweise mit operativen systemspezifischen Bibliotheken verkürzt werden. Dieser Ansatz ist weniger tragbar, da der Code Anpassungen für verschiedene Systeme benötigt (Linux, Windows, MacOS).
* Linux (mit `GetTimeOfday`): Sie müssten eine Schnittstelle zur Funktion "GetTimeofday" aus der "` Header -Datei "deklarieren. Dies beinhaltet die Verwendung des Moduls `iso_c_binding` und sorgfältiger Handhabung. Beispiel (erfordert Fehlerbehandlung für den Produktionscode):
`` `fortran
Programm Timing_example_getTimeofday
Verwenden Sie ISO_C_BINDING
implizit keine
Fügen Sie 'time.h' // oder verwenden Sie eine geeignete Alternative für Ihren Compiler. Einige Compiler benötigen keine expliziten Einschlüsse.
Typ (c_ptr) ::tv
Ganzzahl (c_int) ::Rc
double precision ::start_time, end_time, leftsed_time
zuweisen (Fernseher)
rc =c_getTimeofday (TV, C_NULL_PTR)! Holen Sie sich die Startzeit
start_time =c_f_double (c_loc (tv)%Zeit) + c_f_double (c_loc (tv)%tv_sec)
! Ihr zu zeitgesteuerter Code geht hier
! ... lange Berechnungen ...
rc =c_getTimeofday (TV, C_NULL_PTR)! Holen Sie sich die Endzeit
end_time =c_f_double (c_loc (tv)%Zeit) + c_f_double (c_loc (tv)%tv_sec)
Deallocate (TV)
leftsed_time =end_time - start_time
Drucken *, "Verstrichene Zeit:", verkleinerte_Time, "Sekunden"
Endprogramm Timing_example_getTimeofday
`` `
Denken Sie daran, mit geeigneten Flags zu kompilieren, um mit den erforderlichen Bibliotheken verbunden zu werden (z. B. `-lrt` für" GetTimeOfday "unter Linux). Der genaue Kompilierungsbefehl hängt von Ihrem Compiler (GFortran, IFORT usw.) ab.
Wählen Sie die Methode, die Ihren Anforderungen am besten entspricht. Für einfaches Timing ist `cpu_time` ausreichend. Verwenden Sie für eine bessere Präzision `system_clock`. Erwägen Sie, plattformspezifische Bibliotheken zu verwenden, um die höchste Präzision und die genaueste Wand-Clock-Zeit zu verwenden, aber Sie achten Sie auf die Auswirkungen der Portabilität. Beachten Sie immer, dass die Timerauflösung zwischen den Systemen stark unterschiedlich ist. Daher sollten Sie keine mikrosekundenige Präzision auf allen Plattformen und Konfigurationen erwarten.