|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
Tempo esecuzione [C++]
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... |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Nella libreria standard non credo...
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
Quote:
Sai dove posso trovare una funzione di questo tipo? 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"? |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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... |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
Perchè mi da errore?
La compilazione del seguente codice (compilo con Visual Studio) va a buon fine, ma quando faccio il link mi da il seguente errore:
--------------------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; } |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
Ho risolto il problema: si deve fare il link anche con la winmm.lib
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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... |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Firenze
Messaggi: 630
|
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).
__________________
---> Lombardp CSS Certified Expert (Master Level) at Experts-Exchange Proud user of LITHIUM forum : CPU technology Webmaster of SEVEN-SEGMENTS : Elettronica per modellismo |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
#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; ............ Codice:
//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;
}
|
|
|
|
|
|
#10 | |
|
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
Quote:
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
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 |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Quote:
qualche funzione 9 su 10 ti darà 0 perchè sotto il millisecondo non va. Normalmente si sta sotto,molto sotto. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:44.



















