Fortran erbjuder flera sätt att implementera en timer för att mäta exekveringstid. Det bästa tillvägagångssättet beror på dina behov av precision och portabilitet. Här är tre vanliga metoder:
1. Använda funktionen `CPU_TIME '(enklaste, men mindre exakt):
Detta är den enklaste metoden som är inbyggd direkt i Fortran. `CPU_TIME 'Returnerar processortiden som används av programmet sedan starten på några sekunder. Det är i allmänhet mindre exakt än andra metoder, särskilt på multikärnsystem där det kanske inte återspeglar sann väggklockningstid.
`` `Fortran
program timing_example
implicit ingen
Real ::Start_Time, End_Time, Elapsed_Time
Ring CPU_TIME (Start_Time)
! Din kod som ska tidpunkten går hit
! ... långa beräkningar ...
Ring CPU_TIME (END_TIME)
ELAPSED_TIME =END_TIME - START_TIME
Skriv ut *, "förfluten CPU -tid:", ELAPSED_TIME, "SECONDS"
slutprogram timing_example
`` `
2. Använda "System_Clock" Intrinsic Subroutine (mer exakt, plattformsberoende):
`System_Clock` ger mer kontroll och potentiellt högre precision. Det låter dig ange enheterna för den returnerade tiden (t.ex. sekunder, millisekunder, mikrosekunder). De tillgängliga enheterna och precisionen är emellertid systemberoende.
`` `Fortran
program timing_example_system_clock
implicit ingen
heltal, parameter ::count_rate =1000! Räkningsgrad i millisekunder
heltal ::start_count, end_count, eLAPSED_COUNT
REAL ::eLAPSED_TIME
Call System_Clock (Start_Count, count_rate)
! Din kod som ska tidpunkten går hit
! ... långa beräkningar ...
Call System_Clock (END_COUNT, COUNT_RATE)
eLAPSED_COUNT =END_COUNT - START_COUNT
ELAPSED_TIME =Real (ELAPSED_COUNT) / REAL (count_rate)
Skriv ut *, "förfluten tid:", eLAPSED_TIME, "sekunder"
Slutprogram timing_example_system_clock
`` `
3. Använda plattformsspecifika bibliotek (mest exakta, minst bärbara):
För de högsta precision och mest exakta mätningarna av väggklockan kan du behöva gränssnitt med operativsystemspecifika bibliotek. Detta tillvägagångssätt är mindre bärbart eftersom koden kommer att behöva justeringar för olika system (Linux, Windows, MacOS).
* Linux (med `getTimeOfday`): Du måste förklara ett gränssnitt till funktionen "getTimeOfday" från "` rubrikfilen. Detta innebär att använda modulen "ISO_C_BINDING` och noggrann hantering av typ. Exempel (kräver felhantering för produktionskod):
`` `Fortran
Program Timing_Example_GetTimeOfday
Använd iso_c_binding
implicit ingen
Inkludera 'Time.h' // eller använd ett lämpligt alternativ för din kompilator. Vissa kompilatorer kräver inte uttryckligt inkluderar.
Typ (C_PTR) ::TV
heltal (c_int) ::rc
dubbel precision ::start_time, end_time, eLAPSED_TIME
Allocate (TV)
rc =c_getTimeOfday (TV, C_NULL_PTR)! Få starttid
start_time =c_f_double (c_loc (TV)%tid) + c_f_double (c_loc (TV)%TV_SEC)
! Din kod som ska tidpunkten går hit
! ... långa beräkningar ...
rc =c_getTimeOfday (TV, C_NULL_PTR)! Få sluttid
END_TIME =C_F_DOUBLE (C_LOC (TV)%tid) + C_F_Double (C_LOC (TV)%TV_SEC)
Deallocate (TV)
ELAPSED_TIME =END_TIME - START_TIME
Skriv ut *, "förfluten tid:", eLAPSED_TIME, "sekunder"
Slutprogram timing_example_getTimeOfday
`` `
Kom ihåg att sammanställa med lämpliga flaggor för att länka mot nödvändiga bibliotek (t.ex. `-lrt` för` getTimeOfday` på Linux). Det exakta kompileringskommandot beror på din kompilator (GFORTRAN, IFORT, etc.).
Välj den metod som bäst passar dina behov. För enkel timing är "cpu_time" tillräckligt. För bättre precision, använd `System_Clock '. För den högsta precisionen och den mest exakta väggklockan kan du överväga att använda plattformsspecifika bibliotek men vara medveten om portabilitetskonsekvenser. Var alltid medveten om att timerupplösningen varierar mycket mellan system. Därför bör du inte förvänta dig mikrosekund precision på alla plattformar och konfigurationer.