Come altri hanno già notato, la funzione time () nella libreria standard C non ha una risoluzione migliore di un secondo. L'unica funzione C completamente portatile che può fornire una migliore risoluzione sembra essere clock (), ma che misura il tempo del processore piuttosto che il tempo di wallclock. Se uno è contento di limitarsi alle piattaforme POSIX (ad es. Linux), allora la funzione clock_gettime () è una buona scelta.
A partire da C ++ 11, sono disponibili strutture di timing molto migliori che offrono una migliore risoluzione in una forma che dovrebbe essere molto portabile su diversi compilatori e sistemi operativi. Allo stesso modo, la libreria boost :: datetime offre buone classi di temporizzazione ad alta risoluzione che dovrebbero essere altamente portabili.
Una sfida nell'uso di una di queste strutture è il ritardo introdotto dall'interrogazione dell'orologio di sistema. Dalla sperimentazione di clock_gettime (), boost :: datetime e std :: chrono, questo ritardo può facilmente essere una questione di microsecondi. Pertanto, quando si misura la durata di qualsiasi parte del codice, è necessario consentire che si verifichi un errore di misurazione di queste dimensioni o provare in qualche modo a correggere l'errore zero. Idealmente, potresti voler raccogliere più misurazioni del tempo impiegato dalla tua funzione e calcolare il tempo medio o massimo / minimo impiegato in molte sessioni.
Per aiutare con tutti questi problemi di portabilità e raccolta di statistiche, ho sviluppato la libreria cxx-rtimers disponibile su Github che cerca di fornire una semplice API per i blocchi di temporizzazione del codice C ++, calcolare zero errori e riportare statistiche da più timer incorporati nel tuo codice. Se hai un compilatore C ++ 11, devi semplicemente #include <rtimers/cxx11.hpp>
usare qualcosa come:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
All'uscita dal programma, otterrai un riepilogo delle statistiche di temporizzazione scritto su std :: cerr come:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
che mostra il tempo medio, la sua deviazione standard, i limiti superiore e inferiore e il numero di volte in cui è stata chiamata questa funzione.
Se vuoi usare funzioni di temporizzazione specifiche di Linux, puoi #include <rtimers/posix.hpp>
, o se hai le librerie Boost ma un compilatore C ++ più vecchio, puoi farlo #include <rtimers/boost.hpp>
. Esistono anche versioni di queste classi di timer che possono raccogliere informazioni temporali statistiche su più thread. Esistono anche metodi che consentono di stimare l'errore zero associato a due query immediatamente consecutive dell'orologio di sistema.
time()
restituisce un valore diverso.