Ho bisogno di creare un profilo temporale per diversi moduli in Fortran, il che significa che dovrei scrivere lo stesso codice in ogni inizio e fine di ogni funzione.
In realtà, sembra così:
#ifdef TIME_PROFILING
real :: t1, t2 !< Variables used for time storage
call cpu_time(t1)
#endif
*** FUNCTION CODE ***
#ifdef TIME_PROFILING
call cpu_time(t2)
write(*, "(A)") '+----------------+'
write(*, "(A, E15.7, A)") '| TIME PROFILING | Function init_components() was running for ', t2-t1, 's.'
write(*, "(A)") '+----------------+'
#endif
Stavo pensando di creare una funzione, che conterrebbe chiamare cpu_time()
per la seconda volta e il messaggio finale, ma non penso, è sufficiente. Tuttavia sarò costretto a scrivere tutte le direttive, a dichiarare le variabili t1
e t2
e a chiamare cpu_time()
manualmente per la prima volta in ogni funzione.
Inizialmente volevo creare un modulo separato time_profiler_m
per questa funzione.
Dopo aver pensato agli svantaggi mi è venuta l'idea di creare macro, che mi avrebbe permesso di scrivere qualcosa del genere:
#ifdef TIME_PROFILING
TIME_PROFILING_START
#endif
*** FUNCTION CODE ***
#ifdef TIME_PROFILING
TIME_PROFILING_STOP
#endif
che è molto più breve, ma, d'altra parte, non sono sicuro della correttezza dell'uso di macro come questa e sono abbastanza sicuro, che è un progetto piuttosto scadente creare un modulo separato per una macro.
Quindi, quale pensi che sia il design corretto in questa situazione?