|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 28
|
[c] Tempo di esecuzione di un algoritmo
Salve,
volevo chiedere come poter calcolare in C il tempo di esecuzione di un pezzo di programma, io ho adottato questo metodo: Codice:
#include <time.h>
int main(){
clock_t inizio, fine;
double tempo;
inizio = clock();
/*pezzo di codice*/
fine = clock();
tempo = (double)(fine - inizio)/(double) CLOCKS_PER_SEC;
printf("Il tempo di esecuzione e': %f", tempo);
system("pause");
return 0;
}
Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 1056
|
Beh se lo dividi per CLOCKS_PER_SEC certo che restituisce il tempo in secondi.
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12883
|
Sei sotto Windows o sotto Linux?
Sotto Windows ci sono le funzioni QueryPerformanceCounter e QueryPerformanceFrequency. http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx Ultima modifica di WarDuck : 07-02-2011 alle 22:16. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Ti conviene inoltre eseguire "/*pezzo di codice*/" qualche centinaio di migliaia di volte, in modo da poter rilevare differenze apprezzabili.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#5 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 28
|
Quote:
|
|
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 28
|
Per favore come posso esprimere il tempo in millisecondi?? E' urgente
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Sotto Windows, il modo più preciso (mooolto preciso, mi pare che si possa arrivare alla precisione di meno di un nanosecondo) è di usare il Performance Counter, questo è un esempio:
Codice:
#include <windows.h> ... LARGE_INTEGER a, b, oh, freq; double tempo; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&a); QueryPerformanceCounter(&b); oh.QuadPart = b.QuadPart - a.QuadPart; QueryPerformanceCounter(&a); //Inserisci qui il codice da eseguire QueryPerformanceCounter(&b); tempo = (double)(b.QuadPart - a.QuadPart - oh.QuadPart)/freq; La parte iniziale è il calcolo dell'overhead, cioè serve per aumentare l'accuratezza rimuovendo il tempo necessario alla chiamata della funzione QueryPerformanceCounter. |
|
|
|
|
|
#8 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 28
|
Quote:
Grazie mille ma con DevC++ mi da l'errore: "Invalid operands to binary /" sulla stringa Codice:
tempo = (double)(b.QuadPart - a.QuadPart - oh.QuadPart)/freq; Ultima modifica di markz88 : 09-02-2011 alle 18:25. |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Errore mio, devi dividere per freq.QuadPart
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 1056
|
Quote:
Quote:
Ritorna il numero di cicli di clock della CPU fino a quel momento, ed è la misurazione di temporizzazione più precisa che puoi fare su un PC, in quanto non esistono secondi, microsecondi e nanosecondi come di tu, ma solo cicli di clock del generatore. Quindi clock () (standard, quindi funzionerà su tutti i PC che implementano librerie C) e QueryPerformanceCounter() (non portabile) fanno esattamente la stessa cosa, anzi quasi sicuramente QueryPerformanceCounter () usa clock() per recuperare il numero di clock . Non dividendo il risultato di clock(); per CLOCKS_PER_SEC recuperi il numero di cicli di clock. Ti consiglio di usare clock() che almeno è portabile tra i SO Codice:
#include <time.h>
int main() {
clock_t inizio;
long tempo_esec;
inizio = clock();
.............
tempo_esec = (clock() - inizio) / (CLOCKS_PER_SEC / 3600) // TEmpo di esec in millisecondi
}
Ultima modifica di Shinnok.Exor : 09-02-2011 alle 19:29. |
||
|
|
|
|
|
#11 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 28
|
Quote:
|
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 1056
|
Quote:
Codice:
tempo_esec = ((clock() - inizio)/CLOCKS_PER_SEC)*3600 Codice:
tempo_esec =(clock() - inizio)/CLOCKS_PER_SEC |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Feb 2010
Messaggi: 466
|
Codice PHP:
__________________
I robot hanno scintillanti fondoschiena metallici che non dovrebbero essere baciati. |
|
|
|
|
|
#14 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 28
|
Quote:
Ma vorrei porti una domanda, come mai per trasfomare i microsecondi in secondi dividi per 10.000.000 e non per 1.000.000 come indicato nella tabella di conversione della matematica?
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Feb 2010
Messaggi: 466
|
Quote:
la struct FILETIME contiene appunto: FILETIME Structure Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).
__________________
I robot hanno scintillanti fondoschiena metallici che non dovrebbero essere baciati. |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
|
|
|
|
|
|
|
#17 |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 28
|
Grazie a tutti per le risposte
|
|
|
|
|
|
#18 | |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Quote:
La funzione clock() del C returna una certa quantità di clock, che però non sono i cicli di clock del processore, ma si basano su una costante CLOCKS_PER_SEC sempre fissa, decisa dal compilatore (di solito è qualcosa tipo 1000000). Invece il PerformanceCounter usa direttamente la frequenza del processore come unità di misura (quindi se il tuo processore è da 3 GHz, avrai 1/(3 GHz) di risoluzione, cioè 0.33 nanosecondi). In ogni caso concordo sul fatto che forse in questo caso la funzione clock() del C è più appropriata, sia perché non penso che gli sia richiesta tantissima precisione, ed inoltre è portabile. |
|
|
|
|
|
|
#19 | |
|
Junior Member
Iscritto dal: May 2007
Messaggi: 28
|
Quote:
Codice:
tempo = (double)(finish - start)/CLOCKS_PER_SEC; Ultima modifica di markz88 : 10-02-2011 alle 20:20. |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Feb 2010
Messaggi: 466
|
io ti posso consigliare cosi:
Codice PHP:
__________________
I robot hanno scintillanti fondoschiena metallici che non dovrebbero essere baciati. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:38.





















