Time profiling - usa le macro male?

0

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?

    
posta Eenoku 22.11.2017 - 12:33
fonte

1 risposta

-1

I miei pensieri sono che le chiamate alle funzioni di temporizzazione sono un po 'come la registrazione. Sono utili informazioni di debug ma forse non vuoi farlo sempre nel tuo programma. E qual è la pratica standard per la registrazione?

Generalmente si crea un modulo che si occupa della registrazione e quindi si esegue la chiamata appropriata per accedere con un livello (DEBUG, INFO, WARNING, ERROR). Il modulo, in base alla sua configurazione, deciderà quindi se registrare o meno qualsiasi cosa. Può essere che la registrazione non faccia nulla, ma una chiamata è ancora fatta.

Probabilmente dovresti considerare di fare qualcosa di simile per i tempi. Se il cronometraggio è disabilitato, la chiamata per contrassegnare l'ora corrente non farà nulla. Allo stesso modo, la chiamata per contrassegnare la differenza non farà nulla.

Non è la stessa cosa delle macro come le macro sono pre-processate, quindi sono le risorse in scadenza che eseguono una chiamata. Comunque direi che ne vale la pena. Significa che il tuo programma è capace di farlo se lo ritieni necessario, invece di compilare una versione che lo fa o non lo fa.

È piuttosto soggettivo, ma non credo che la perdita di prestazioni sia sufficiente per trasformarla in una macro.

    
risposta data 22.11.2017 - 14:45
fonte

Leggi altre domande sui tag