Se si utilizza C++ 11 è possibile utilizzare system_clock::now()
:
auto start = std::chrono::system_clock::now();
/* do some work */
auto end = std::chrono::system_clock::now();
auto elapsed = end - start;
std::cout << elapsed.count() << '\n';
è anche possibile specificare la granularità da utilizzare per la rappresentazione di una durata:
// this constructs a duration object using milliseconds
auto elapsed =
std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
// this constructs a duration object using seconds
auto elapsed =
std::chrono::duration_cast<std::chrono::seconds>(end - start);
Se non è possibile utilizzare C + +11, quindi dai uno sguardo a chrono da Boost.
La cosa migliore dell'utilizzo di tali librerie standard è che la loro portabilità è veramente alta (ad esempio, funzionano entrambi in Linux e Windows). Quindi non è necessario preoccuparsi troppo se in seguito si decide di eseguire il porting dell'applicazione.
Queste librerie seguono anche un moderno design C++, al contrario degli approcci di tipo C.
MODIFICA: L'esempio precedente può essere utilizzato per misurare wall-clock time. Questo non è, tuttavia, l'unico modo per misurare il tempo di esecuzione di un programma. In primo luogo, possiamo distinta tra utente e sistema di tempo:
- time Utente: Il tempo speso dal programma in esecuzione in user space.
- Ora di sistema: Il tempo trascorso dal programma in esecuzione nello spazio di sistema (o kernel). Un programma entra nello spazio del kernel, ad esempio quando si esegue un system call.
A seconda degli obiettivi, può essere necessario o non considerare l'ora del sistema come parte del tempo di esecuzione di un programma. Ad esempio, se l'obiettivo è misurare semplicemente l'ottimizzazione del compilatore sul codice utente, è probabilmente meglio lasciare il tempo di sistema. D'altra parte, se l'utente desidera determinare se le chiamate di sistema sono un sovraccarico significativo, è necessario misurare anche l'ora del sistema.
Inoltre, poiché la maggior parte dei sistemi moderni è time-shared, diversi programmi possono competere per diverse risorse di elaborazione (ad es. CPU). In tal caso, un'altra distinzione può essere fatta:
- Wall-clock time: Utilizzando tempo orologio a muro l'esecuzione del programma viene misurato nello stesso modo come se stessimo usando un orologio (parete) esterna. Questo approccio non considera l'interazione tra i programmi.
- CPU time: In questo caso contiamo solo il tempo in cui un programma è effettivamente in esecuzione sulla CPU.Se un programma (P1) è co-programmato con un altro (P2), e vogliamo ottenere il tempo CPU per P1, questo approccio non include il tempo mentre P2 è in esecuzione e P1 è in attesa della CPU (al contrario di l'approccio all'orologio a muro).
per misurare il tempo di CPU, Boost include un set of extra clocks:
process_real_cpu_clock
, cattura il tempo di CPU orologio da parete speso dal processo in corso.
process_user_cpu_clock
, cattura il tempo della CPU utente trascorso dal processo corrente.
process_system_cpu_clock
, cattura il tempo della CPU del sistema trascorso dal processo corrente. Una classe simile a una tupla process_cpu_clock
, che cattura insieme i tempi di elaborazione reali, della CPU utente e della CPU di sistema.
- A
thread_clock
thread clock costante che fornisce il tempo trascorso dal thread corrente (quando supportato da una piattaforma).
Sfortunatamente, C++ 11 non ha tali orologi. Ma Boost è una libreria ampiamente utilizzata e, probabilmente, questi orologi aggiuntivi saranno incorporati in C++ 1x ad un certo punto. Quindi, se usi Boost, sarai pronto quando il nuovo standard C++ li aggiungerà.
Infine, se si desidera misurare il tempo impiegato da un programma per eseguire dalla riga di comando (anziché aggiungere del codice al programma), è possibile dare un'occhiata al comando time, proprio come suggerisce @ BЈовић. Questo approccio, tuttavia, non consente di misurare singole parti del programma (ad es. Il tempo necessario per l'esecuzione di una funzione).
In quale sistema operativo è in esecuzione il codice? –
Mi piace profilare più codici contemporaneamente. – Puppy
basta usare il comando 'time' quando si avvia qualunque programma. – Jasen