Torna indietro   Hardware Upgrade Forum > Software > Programmazione

PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-06-2008, 14:39   #1
Lelex82
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);
}
il problema è che il tempo visualizzato non è realmente quello trascorso. sbaglio qualcosa nella formula del printf?
Lelex82 è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2008, 20:43   #2
ramarromarrone
Senior Member
 
Iscritto dal: Jun 2007
Messaggi: 497
per misurare il tempo di esecuzione :

Quote:
#include <time.h>
.....
int main() {
time_t m;
time_t now = time(NULL);
.....
.....
m = difftime(time(NULL), now);
printf("tempo totale in secondi: %ld\n",m);
return 0;
}
ramarromarrone è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2008, 21:47   #3
tæo
Member
 
L'Avatar di tæo
 
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.
tæo è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2008, 12:18   #4
Lelex82
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?
Lelex82 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2008, 12:41   #5
ramarromarrone
Senior Member
 
Iscritto dal: Jun 2007
Messaggi: 497
Quote:
Originariamente inviato da Lelex82 Guarda i messaggi
grazie ragazzi,vanno bene entrambe i modi!
@ramarromarrone: qual è la sintassi nel printf per visualizzare anche i centesimi di secondo?
così su due piedi non lo so...dovrei cercare..

ora non ho tempo appena riesco cerco e ti faccio sapere
ramarromarrone è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2008, 20:58   #6
mjordan
Bannato
 
L'Avatar di mjordan
 
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.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2008, 21:07   #7
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da Lelex82 Guarda i messaggi
grazie ragazzi,vanno bene entrambe i modi!
@ramarromarrone: qual è la sintassi nel printf per visualizzare anche i centesimi di secondo?
I centesimi di secondo vanno calcolati, non ci sono parametri printf() che restituiscano centesimi da funzioni che restituiscono secondi...
Non sei mica sotto Java, li hai il metodo statico currentTimeMillis() della classe System.

Ultima modifica di mjordan : 05-06-2008 alle 21:13.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2008, 21:30   #8
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da mjordan Guarda i messaggi
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.
Sono in linea con te... uso la stessa tecnica per alcuni programmi di esempio in cui evidenzio le differenze in tempi di esecuzione tra algoritmi ricorsivi e iterativi.
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
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2008, 21:41   #9
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Sono in linea con te... uso la stessa tecnica per alcuni programmi di esempio in cui evidenzio le differenze in tempi di esecuzione tra algoritmi ricorsivi e iterativi.
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?
No, quella equivalente (e obsoleta) è CLK_TCK che tra l'altro è una macro, non una costante. CLK_PER_SEC è proprio la costante usata da clock() ed è definita in time.h
Che compilatore usi?

Ultima modifica di mjordan : 05-06-2008 alle 21:44.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2008, 01:18   #10
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da mjordan Guarda i messaggi
No, quella equivalente (e obsoleta) è CLK_TCK che tra l'altro è una macro, non una costante. CLK_PER_SEC è proprio la costante usata da clock() ed è definita in time.h
Che compilatore usi?
Uso gcc 4.2.3, ma anche con mingw 3.4.5 che ho sotto windows ho lo stesso comportamento: CLK_PER_SEC non viene riconosciuta.

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
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2008, 03:24   #11
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da mjordan Guarda i messaggi
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.
No, dai. Non e' sbagliato ne' fuorviante.
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:
Originariamente inviato da mjordan Guarda i messaggi
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 ...
Non cambia il problema. Hai qualche decimo di secondo di precisione in piu', anche meno su certi sistemi operativi. In compenso devi fare un bel po' di lavoro in piu' - non portabile ed a grosso rischio di errori.
Insomma, rischi di perderci un pomeriggio per poi accorgerti di non avere dati significativamente piu' precisi.


Quote:
Originariamente inviato da mjordan Guarda i messaggi
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.
Come dicevo, ci si puo' accontentare anche della time(), anche per problemi che vanno ben oltre il compito in classe (e anche la tesina).

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
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2008, 11:01   #12
Lelex82
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
Lelex82 è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2008, 22:26   #13
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Uso gcc 4.2.3, ma anche con mingw 3.4.5 che ho sotto windows ho lo stesso comportamento: CLK_PER_SEC non viene riconosciuta.

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).
Interessante. Mi fai sapere invece se hai definita la costante CLOCK_PROCESS_CPUTIME_ID?
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2008, 22:38   #14
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da sottovento Guarda i messaggi
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?
Penso che non ha senso parlarne, perchè stiamo misurando codice applicativo e non di sistema che confronta tempi di esecuzione su strutture dati. Avere quindi un punto di riferimento per le misurazioni (il numero di tick trascorso in un secondo) è piu' che sufficiente per lo scopo. In genere misurare algoritmi differenti sullo stesso SO e sulla stessa istanza del medesimo SO è piu' che sufficiente e ci consente di trascurare questi dettagli. Dettagli che alla fin fine è alquanto lecito trascurare (considerando che stiamo parlando non piu' che di strutture dati ed algoritmi su di esse).

Quote:
Non cambia il problema. Hai qualche decimo di secondo di precisione in piu', anche meno su certi sistemi operativi. In compenso devi fare un bel po' di lavoro in piu' - non portabile ed a grosso rischio di errori.
Insomma, rischi di perderci un pomeriggio per poi accorgerti di non avere dati significativamente piu' precisi.
No, hai proprio dei dati precisi. I decimi di secondo sono determinanti per valutare la vittoria di una gara automobilistica, figurati se non servono per misurare algoritmi. Il metodo che ho descritto va oltre i decimi di secondo: stiamo parlando di precisione al millisecondo. Avere dei tempi di accesso piu' veloci di "qualche decimo di secondo" su algoritmi che hanno tempi magari super polinomiali fa una bella differenza. I profiler tengono traccia anche dei ms, figuriamoci se i decimi non sono rilevanti.
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:
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?
E' soggetta a tutte quelle casistiche non prevedibili dall'utente, non controllabili dall'utente in fase di runtime, come segnali, eventuali fenomeni di starvation o di deadlock del sistema operativo, preemption del processo da parte dello scheduler dovuto ad un'evento inaspettato di sistema, caricamento del loader della tabella dei simboli, eventuale presenza di simboli di debug extra non eliminabili nel binario, scarsa ottimizzazione in alcuni casi da parte del compilatore e chi piu' ne ha piu' ne metta. Chiaramente una misurazione che sia attendibile prende in considerazione un certo numero di esecuzioni e ne calcola una varianza statistica. Ancora non preciso, ma non stiamo lavorando con orologi atomici, in fondo. Questi eventi fanno parte del ciclo di esecuzione, del resto. Ecco perchè calcolare una varianza aiuta nella precisione ma non ci suicidiamo se comunque ci sono queste "interferenze".


Quote:
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.
Non nell'ambito della complessità computazionale. In questo modo usiamo sempre un processo in piu' che si aggiudica a intervalli pre-stabiliti qualche ciclo di cpu-burst. Misurare algoritmi è un processo delicato, ecco perchè in genere è meglio affidarsi a dei profiler, che cercano di "creare" le condizioni di esecuzione ottimali per un determinato programma. Generano "rumore" che comunque sono in grado di auto trascurare. Ma qui siamo in ambito di un'esercizio. Se devo usare un comando shell per misurare algoritmi allora preferisco usare Valgrind, quanto meno sto utilizzando uno strumento decisamente sofisticato.

Ultima modifica di mjordan : 06-06-2008 alle 23:18.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2008, 02:38   #15
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da mjordan Guarda i messaggi
Penso che non ha senso parlarne, perchè stiamo misurando codice applicativo e non di sistema che confronta tempi di esecuzione su strutture dati.
Per questo ho fatto l'esempio di un sistema run-to-completion.
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:
Originariamente inviato da mjordan Guarda i messaggi
No, hai proprio dei dati precisi. I decimi di secondo sono determinanti per valutare la vittoria di una gara automobilistica, figurati se non servono per misurare algoritmi. Il metodo che ho descritto va oltre i decimi di secondo: stiamo parlando di precisione al millisecondo.
A dirla tutta non ho mai visto tick di sistema cosi' precisi. Un conto e' quanto dichiarato. Cmq ribadisco: dipende sempre dal problema.

Quote:
Originariamente inviato da mjordan Guarda i messaggi
Avere dei tempi di accesso piu' veloci di "qualche decimo di secondo" su algoritmi che hanno tempi magari super polinomiali fa una bella differenza. I profiler tengono traccia anche dei ms, figuriamoci se i decimi non sono rilevanti.
Accedendo a risorse di sistema. Se sei su una macchina, per esempio, time sharing, non hai alternative. Solo il sistema sa esattamente quanto tempo stai impiegando.

Quote:
Originariamente inviato da mjordan Guarda i messaggi
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?
Nulla, poiche' ripeterai l'algoritmo "super polinomiale". Ripetendolo, il tempo sara' proporzionale al numero di ripetizioni, indipendentemente dall'algoritmo, no?

Quote:
Originariamente inviato da mjordan Guarda i messaggi
Che i tempi di esecuzione si propagano in modo esponenziale.
Ho un algoritmo di qualsiasi complessita'. Lo ripeto 10 volte, mi aspetto che il tempo sia 10 volte maggiore. Questo indipendentemente dalla complessita'.


Quote:
Originariamente inviato da mjordan Guarda i messaggi
E' soggetta a tutte quelle casistiche non prevedibili dall'utente, non controllabili dall'utente in fase di runtime, come segnali,
Beh, dipende dalla macchina.

Quote:
Originariamente inviato da mjordan Guarda i messaggi
eventuali fenomeni di starvation
starvation = aumento del carico. Torniamo al punto di prima

Quote:
Originariamente inviato da mjordan Guarda i messaggi
o di deadlock del sistema operativo,
deadlock = diminuzione del carico. Torniamo al punto di prima

Quote:
Originariamente inviato da mjordan Guarda i messaggi
preemption del processo da parte dello scheduler
Dipende dalla macchina, ovviamente. Torna l'esempio del run-to-completion

Quote:
Originariamente inviato da mjordan Guarda i messaggi
Misurare algoritmi è un processo delicato, ecco perchè in genere è meglio affidarsi a dei profiler, che cercano di "creare" le condizioni di esecuzione ottimali per un determinato programma. Generano "rumore" che comunque sono in grado di auto trascurare. Ma qui siamo in ambito di un'esercizio. Se devo usare un comando shell per misurare algoritmi allora preferisco usare Valgrind, quanto meno sto utilizzando uno strumento decisamente sofisticato.
D'accordissimo. L'unica cosa che mi permettevo di far osservare, nel post precedente, era che usare la time() non era certamente inutile e fuorviante.
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
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2008, 03:57   #16
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Per questo ho fatto l'esempio di un sistema run-to-completion.
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.
Io non so se hai mai studiato ingegneria del software, ma a quanto sembra pare di no: la metrica di McCabe considera esclusivamente la complessità relativa allo "sforzo" complessivo a completare un task. Punto. Tutto il resto è inventato da te per creare enigmi su un'argomento che invece è ben definito. Quella roba serve per prendere 18 ad un'esame di sistemi operativi, non per misurare i tempi di esecuzione su un'algoritmo. Nessuno si interroga su queste cose per misurare i tempi di un'algoritmo. Semplicemente non serve. Un'algoritmo gira sotto un sistema operativo e il sistema operativo va preso come assunto. Semplice e chiaro. Tu praticamente stai dicendo che per misurare la velocità delle automobili bisogna farlo in assenza di attrito di aria, gomme e forza di gravità...

Quote:
A dirla tutta non ho mai visto tick di sistema cosi' precisi. Un conto e' quanto dichiarato. Cmq ribadisco: dipende sempre dal problema.
Qui allora mi dimostri che non capisci nemmeno di cosa stiamo parlando Cosa vuol dire "tick di sistema cosi precisi" quando il clock tick è l'unità temporale piu' piccola esprimibile in un sistema hardware?

Quote:
Accedendo a risorse di sistema. Se sei su una macchina, per esempio, time sharing, non hai alternative. Solo il sistema sa esattamente quanto tempo stai impiegando.
E non lo sa forse grazie ai tick "che non hai mai visto essere cosi precisi"?
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:
Nulla, poiche' ripeterai l'algoritmo "super polinomiale". Ripetendolo, il tempo sara' proporzionale al numero di ripetizioni, indipendentemente dall'algoritmo, no?
Forse non ci siamo capiti. Se tu ripeti sempre lo stesso programma, bene o male ottieni sempre gli stessi risultati. Non è questo lo scopo di misurare i tempi di un'algoritmo. I tempi di un'algoritmo si misurano perchè se tolgo 2ms da una routine critica in un renderer, un rendering impegnativo ci mette 4 ore di meno. Se tolgo 3 ms da una routine di commit di un database, quando applico quella routine su un database da 8 petabyte ci metto 40 secondi di meno a fare commit. Se tolgo 1 ms di meno da una routine che applica un post processing per ogni fotogramma di un videogioco, il videogioco mi va a 40fps anziche a 8 fps.
E questo significa che "qualche decimo di secondo" è trascurabile come hai detto?
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:
Ho un algoritmo di qualsiasi complessita'. Lo ripeto 10 volte, mi aspetto che il tempo sia 10 volte maggiore. Questo indipendentemente dalla complessita'.
Io non ho mai parlato di ripetere "10 volte", quello non è misurare un'algoritmo, quello non significa niente. Io parlo di ripetere l'algoritmo su input piu grandi e variegati. E questo di certo non è indipendente dalla complessità.
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:
D'accordissimo. L'unica cosa che mi permettevo di far osservare, nel post precedente, era che usare la time() non era certamente inutile e fuorviante.
Anzi, puo' dare risultati precisi quanto la clock() e con un po' di accortezza, anche migliori. Basta guardare il problema ed agire di conseguenza
Perchè non mi dici come? Sono curioso di capire come tiri fuori millisecondi con la time().
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2008, 00:04   #17
Lelex82
Member
 
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
Quote:
Originariamente inviato da mjordan Guarda i messaggi
I centesimi di secondo vanno calcolati, non ci sono parametri printf() che restituiscano centesimi da funzioni che restituiscono secondi...
potete dirmi come? l'accuratezza in secondi non m è utile...
Lelex82 è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2008, 03:03   #18
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da Lelex82 Guarda i messaggi
potete dirmi come? l'accuratezza in secondi non m è utile...
Nella pratica ti conviene andare con il millisecondo. Il millisecondo (ovviamente) corrisponde a 0.001s.
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 qui il tempo è espresso comunque in secondi, ma il valore è talmente piccolo (numero di cpu ticks) che è comunque un floating point molto piccolo (0.000x s). Se vuoi esprimere il valore comunque in ms, puoi usare uno stratagemma algoritmico per convertirlo: moltiplichi in un ciclo questo numero per 10, controllando ogni volta che sia minore di 1. Se è minore di 1, moltiplichi di nuovo per 10 e cosi via, tenendo conto in una variabile di quante iterazioni hai fatto. Quando il numero è maggiore o uguale di 1, stoppi l'iterazione del ciclo. Il numero di iterazioni che hai fatto, supponiamo 4, corrisponde al secondo. Le n - 1 iterazioni successive corrispondono a unità di misura piu' piccole e conseguenti, quindi 3 sarà il decimo, 2 sarà il centesimo e cosi via...

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");
}
Sicuramente ci sono degli errori, non ho compilato nè provato, ho scritto di getto il codice, ma per darti un'idea dell'algoritmo di conversione dovrebbe essere comunque utile.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2008, 12:52   #19
Lelex82
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.
Lelex82 è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2008, 13:22   #20
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Quote:
Originariamente inviato da Lelex82 Guarda i messaggi
il fatto che stia sotto linux e non sotto windows può influire? xkè nn riesco a prendere questi maledetti tempi di esecuzione!
No. Ma qual è il problema?
mjordan è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Riceve il reso di una RTX 5090 da 4.000 ...
Gli utenti con GPU Intel non possono gio...
Un agente AI visita 5.000 siti dove un u...
IA, virtualizzazione e cyber resilienza:...
AMD aggiorna FSR alla versione 4.1. Migl...
Nuovi suffissi internet 2026: per la sec...
Claudy Day: tre vulnerabilità in ...
Record di efficienza per i pannelli sola...
SteamOS 3.8 è disponibile in ante...
Opel in Formula E dalla Stagione 13: con...
Windows 11 26H1: ecco le scadenze esatte...
Arriva HiSecEngine USG6000G, la nuova ga...
Xiaomi SU7 2026 ufficiale con 902 km di ...
Il tuo vecchio iPhone potrebbe essere gi...
Già disponibile un primo aggiorna...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:12.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v