|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
|
[C] calcolare il tempo di esecuzione di un programma
come da titolo.
correggetemi se sbaglio: includo la libreria time.h poi Codice:
int main(int argc,char **argv)
{clock_t t1,t2;
t1=clock();
{
corpo del programma
t2=clock();
printf("\ntempo di esecuzione=%.10f sec\n",(t2-t1)/(double)CLOCKS_PER_SEC);
return (0);
}
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 497
|
per misurare il tempo di esecuzione :
Quote:
|
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 82
|
se hai bisogno di conoscere il tempo di esecuzione del tuo programma per scopi che esulano dal programma stesso potresti usare il comando time del terminale
Codice:
$ time ./a.out ... /* output del tuo programma */ real 0m0.041s user 0m0.002s sys 0m0.013s
__________________
Saigon, shit. I'm still only in Saigon. |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
|
grazie ragazzi,vanno bene entrambe i modi!
@ramarromarrone: qual è la sintassi nel printf per visualizzare anche i centesimi di secondo? |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 497
|
|
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
In realtà misurare il tempo di esecuzione di un programma è un task assai piu' complesso che usare due semplici funzioni per le date. Usare la funzione time() a questo scopo è sbagliato e fuorviante. Essa infatti è una funzione per le date, non da piu' precisione del secondo come unità temporale. E nel misurare il tempo di esecuzione una precisione nell'ordine del secondo è inutile.
E' invece corretto utilizzare la funzione clock() come descritto nel problema originale, che ritorna il tick count dall'ultima chiamata. Non ci sono funzioni nello standard che possano ritornare valori con precisione dell'ordine del ms o del us, ma si può usare un'espediente: si contano quanti tick count ci sono in un secondo (e questo è definito dalla costante CLK_PER_SEC) e si calcola propriamente usando variabili double il tempo esatto sapendo a che valore corrisponde un tick di CPU ... Quindi le funzioni corrette per assolvere allo scopo non sono la funzione time(), la struttura time_t e la costante CLOCKS_PER_SEC (la cui utilità dovrebbe essere relegata alle date) ma bensi la funzione clock(), la struttura clock_t e la costante CLK_PER_SEC (che invece sono piu' utili per le misurazioni), con un'opportuna routine per convertire i tick in unità temporali relative al secondo. Questo se vogliamo fare le cose fatte bene, altrimenti per l'esercizietto per rispondere alla domanda da compito in classe ci possiamo pure accontentare. Ultima modifica di mjordan : 05-06-2008 alle 21:08. |
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Non sei mica sotto Java, li hai il metodo statico currentTimeMillis() della classe System. Ultima modifica di mjordan : 05-06-2008 alle 21:13. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
Anyway, CLK_PER_SEC col mio compilatore non funziona, su internet ho trovato che dovrebbe essere equivalente a CLOCKS_PER_SEC, e alcune implementazioni della libreria usano un nome o l'altro. Confermate?
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Che compilatore usi? Ultima modifica di mjordan : 05-06-2008 alle 21:44. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
Su cplusplus non si parla proprio di CLK_PER_SEC, mentre su Wikipedia la questione è descritta come ti avevo detto prima (CLOCKS_PER_SEC e CLK_PER_SEC nomi alternativi).
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
|
#11 | |||
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Dipende dal problema che stai affrontando, e da cosa stai usando per risolverlo. La time() ti puo' dare la precisione che vuoi, ovviamente rispetto al problema. Se per esempio voglio sapere quanti microsecondi mi servono per eseguire una funzione, posso chiamarla un miliardo di volte ed avro' la precisione dei nanosecondi. Ammesso, ovviamente, che possa chiamarla un miliardo di volte. Comunque anche questa potrebbe non essere una misura valida. Cosa ne diresti, per esempio, se il sistema operativo sul quale esegui detta misura e' un "run-to-completion", basato essenzialmente su priorita' di tipo statico? Quote:
Insomma, rischi di perderci un pomeriggio per poi accorgerti di non avere dati significativamente piu' precisi. Quote:
Piuttosto, sembra opportuno riflettere sulla misura che si va a prendere, e sulla sua significativita'. Cosa stiamo misurando, esattamente? A quali perturbazioni e' soggetta, questa misura? Ovviamente non so il problema per cui non posso rispondere. Comunque sembra ragionevole, specialmente su sistemi time-sharing, utilizzare primitive messe a disposizione dal sistema. E' pacifico che le misure prese in questo modo, su detti sistemi, dipenderanno da tante cose, fra cui anche il carico della macchina. In questo senso, la risposta piu' precisa e' sicuramente quella data da tæo: utilizzare il comando time da shell, su UNIX, e' la soluzione migliore nella maggior parte dei casi.
__________________
In God we trust; all others bring data |
|||
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
|
devo fare il confronto tra due strutture dati, cioè eseguire lo stesso test sulla stessa macchina, con SO Linux, e analizzare i risultati temporali.
cmq grazie ragazzi |
|
|
|
|
|
#13 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
|
|
|
|
|
|
|
#14 | ||||
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Quote:
Per intenderci, se una ricerca su una lista da 100 elementi impiega 1s, allora una ricerca su una lista da 10.000.000 di elementi impiega 100000 di secondi. E questo perchè la ricerca su una lista è lineare in tempo. Cosa succederebbe se invece consideriamo algoritmi super polinomiali? Che i tempi di esecuzione si propagano in modo esponenziale. In queste circostanza capisci che il decimo di secondo di differenza non solo non è irrilevante come dici ma addirittura una misura ancora troppo grande per essere precisa. La differenza fra una buona funzione hash ed una pessima funzione hash ha differenze di parecchi millisecondi, tempi ancora di molto inferiori al decimo di secondo che invece vuoi trascurare. Fra le altre cose, non ci vuole un pomeriggio nel dividere il numero di tick trascorsi per 60 e normalizzare il tutto nell'ordine dei ms. Quote:
Quote:
Ultima modifica di mjordan : 06-06-2008 alle 23:18. |
||||
|
|
|
|
|
#15 | |||||||
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
In generale, quando fai una misura di questo genere, misuri anche il carico della macchina. Se esegui un solo processo, avrai una certa misura. Se girano 1000 processi in piu' probabilmente le prestazioni degradano. Ovviamente non in un sistema run-to-completion, appunto: in tal caso, indipendentemente da quanti processi il tuo sistema sta facendo girare, il tuo programma girera' sempre alla stessa velocita'. Negli altri casi, no. Quote:
Quote:
Quote:
Quote:
Quote:
starvation = aumento del carico. Torniamo al punto di prima deadlock = diminuzione del carico. Torniamo al punto di prima Dipende dalla macchina, ovviamente. Torna l'esempio del run-to-completion Quote:
Anzi, puo' dare risultati precisi quanto la clock() e con un po' di accortezza, anche migliori. Basta guardare il problema ed agire di conseguenza
__________________
In God we trust; all others bring data |
|||||||
|
|
|
|
|
#16 | ||||||
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
![]() Quote:
Quote:
Ma cosa diavolo c'entra tutto ciò con la misurazione di un'algoritmo? Tutto ciò di cui ti devi preoccupare è tirare fuori i dannati ms di esecuzione. Tutto il resto è indipendente da quello che puoi fare, lo capisci o no? Quote:
Scusami tanto, gli algoritmi di seek degli hard disk lottano all'ultimo millisecondo per migliorare i tempi di accesso e anche un singolo millisecondo di differenza dà prestazioni evidenziabili durante il funzionamento di un hard disk e tu mi dici che qualche decimo di secondo è trascurabile? Non c'è cognizione di causa. Quote:
Se la complessità è O(log(n)), ripetere l'argoritmo su un input 10 volte maggiore da un tempo dieci volte maggiore? Indipendentemente dalla complessità? Se la complessità è O(n* k^n), ripetere l'algoritmo su input dieci volte maggiore ci da un tempo di esecuzione 10 volte maggiore? A questo serve misurare gli algoritmi, mica ad altro. Eppure mi sembra un concetto talmente banale anche per chi abbia imparato ad usare solo un ciclo for() ... Quote:
|
||||||
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
|
|
|
|
|
|
|
#18 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Di conseguenza avrai questa situazione: Codice:
#include <stdio.h>
#include <time.h>
int main(int argc, char ** argv)
{
clock_t t_start, t_end;
double t_passed;
t_start = clock();
/* Qui inserisci la computazione da misurare. */
t_end = clock();
t_passed = ((double)(t_end - t_start)) / CLOCKS_PER_SEC;
printf("Elapsed time: %f seconds.\n", t_passed);
return 0;
}
Nota che tutte le cazzate che si dicevano prima, non sono valide perchè clock() non tiene conto di eventuale tempo perso nell'I/O o da altri fattori esterni all'algoritmo. Potresti avere una situazione del genere: Codice:
void convert_time(const double time)
{
int iterations = 0;
double mul = time;
while (mul <= 0) {
mul =* 10;
iterations++;
}
/* Considerando come secondi il numero di iterazioni, esprimere in ms significa calcolare il tempo a meno di 4 iterazioni */
for (int i = 0; i <= 3; i++)
mul =/ 10;
printf("Elapsed time: %f ms.\n");
}
|
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
|
il fatto che stia sotto linux e non sotto windows può influire? xkè nn riesco a prendere questi maledetti tempi di esecuzione!
EDIT: sto provando a usare la gettimeofday può servire? Ultima modifica di Lelex82 : 26-06-2008 alle 13:22. |
|
|
|
|
|
#20 |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:12.





















