View Full Version : Tempo esecuzione [C++]
miondere
01-04-2003, 18:21
Volevo chiedervi questo:
esiste nella libreria standard una funzione che mi restituisca in
millisecondi (o anche di ordine inferiore) la durata di esecuzione di una
parte del prg, cioè una sorta di contatore che parte in un certo punto (che
posso anche fermare) e in determinati "checkpoint" da me decisi possa
salvare il suo valore dentro una variabile...
Esiste? Spero proprio di sì...
Grazie...
;)
Nella libreria standard non credo...
miondere
01-04-2003, 19:09
Originally posted by "cionci"
Nella libreria standard non credo...
Infatti ho provato a cercare su MSDN ma non ho trovato niente a riguardo...
Sai dove posso trovare una funzione di questo tipo?
:confused:
Cmq il mio professore aveva detto che esisteva ed era: % man getrusage
Ho provato a guardare nella libreria standard, ma nn c'era niente del genere...ti dice qualcosa "getrusage"?
Ma non è della libreria std...
Se da quello che ho capito vuoi il tempo in cui il tuo processo ha occupato il processore allora per Windows puoi usare GetProcessTimes...per Linux quella che ti ha detto il tuo professore...
Se invece ti interessa una misura del assoluta del tempo (non so di quello usato dal processo) allora puoi usare timeGetTime...
miondere
01-04-2003, 22:11
La compilazione del seguente codice (compilo con Visual Studio) va a buon fine, ma quando faccio il link mi da il seguente errore: :cry: :cry: :confused:
--------------------Configuration: gettime - Win32 Debug--------------------
Linking...
gettime.obj : error LNK2001: unresolved external symbol __imp__timeGetTime@0
Debug/gettime.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
gettime.exe - 2 error(s), 0 warning(s)
#include <windows.h>
#include <mmsystem.h>
int main()
{
DWORD snapshot1;
snapshot1=timeGetTime();
return 0;
}
miondere
02-04-2003, 00:33
Ho risolto il problema: si deve fare il link anche con la winmm.lib :muro:
Comunque timeGetTime è utile per fare le differenze di tempo...
Così com'è non ti serve a molto, infatti ritorno il tempo trascorsa da quando Windows è stato avviato...
lombardp
02-04-2003, 08:18
Per fare un profiling "artigianale" io utilizzo la funzione QueryPerformanceCounter (e le altre correlate dell'SDK) che restituisce il valore corrente di un contatore hardware all'interno dei microprocessori. La frequenza di conteggio si ottiene con QueryPerformanceFrequency e usando due volte di seguito QueryPerformanceCounter si ottiene una stima dell'overhead dovuto alla chiamata della funzione.
Dimenticavo, la risoluzione dovrebbe essere sotto il microsecondo (l'inverso della frequenza del contatore hw).
#include <windows.h>
#include "Duration.h"
...
CDuration timer;
timer.Start();
--codice da misurare-
timer.Stop();
cout <<endl<< "Durata della funzione " << timer.GetDuration()/1000.0 << " milliseconds" << endl;
............
//file Duration.h
#pragma once
class CDuration
{
protected:
LARGE_INTEGER m_liStart;
LARGE_INTEGER m_liStop;
LONGLONG m_llFrequency;
LONGLONG m_llCorrection;
public:
CDuration(void);
void Start(void);
void Stop(void);
double GetDuration(void) const;
};
inline CDuration::CDuration(void)
{
LARGE_INTEGER liFrequency;
QueryPerformanceFrequency(&liFrequency);
m_llFrequency = liFrequency.QuadPart;
// Calibration
Start();
Stop();
m_llCorrection = m_liStop.QuadPart-m_liStart.QuadPart;
}
inline void CDuration::Start(void)
{
// Ensure we will not be interrupted by any other thread for a while
Sleep(0);
QueryPerformanceCounter(&m_liStart);
}
inline void CDuration::Stop(void)
{
QueryPerformanceCounter(&m_liStop);
}
inline double CDuration::GetDuration(void) const
{
return (double)(m_liStop.QuadPart-m_liStart.QuadPart-m_llCorrection)*1000000.0 / m_llFrequency;
}
miondere
02-04-2003, 12:27
Originally posted by "cionci"
Comunque timeGetTime è utile per fare le differenze di tempo...
Così com'è non ti serve a molto, infatti ritorno il tempo trascorsa da quando Windows è stato avviato...
Infatti mi serve per vedere da un punto del processo fino ad un altro quanto tempo è trascorso...prendo l'istante iniziale e poi faccio la differenza ;)
Ho dimenticato di dire che la classe non l'ho fatta io. :)
Adoperavo le Api in maniera "rozza" e quando mi decisi a farne una classe
beccai questa per caso,mi risparmiò il lavoro.
Oltretutto alla taratura non ci avevo pensato
Originally posted by "miondere"
Infatti mi serve per vedere da un punto del processo fino ad un altro quanto tempo è trascorso...prendo l'istante iniziale e poi faccio la differenza ;)
Guarda che se tenti di misurare quanto tempo ci vuole ad eseguire
qualche funzione 9 su 10 ti darà 0 perchè sotto il millisecondo non va.
Normalmente si sta sotto,molto sotto. ;)
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.