|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Per migliorare la risoluzione in ambiente Linux puoi usare la funzione gettimeofday:
Codice:
static struct timeval _tstart, _tend;
static struct timezone tz;
void tstart(void)
{
gettimeofday(&_tstart, &tz);
}
void tend(void)
{
gettimeofday(&_tend,&tz);
}
double elapsedtime()
{
double t1, t2;
t1 = (double)_tstart.tv_sec + (double)_tstart.tv_usec/(1000*1000);
t2 = (double)_tend.tv_sec + (double)_tend.tv_usec/(1000*1000);
return t2-t1;
}
|
|
|
|
|
|
#22 |
|
Bannato
Iscritto dal: Sep 2007
Messaggi: 40
|
|
|
|
|
|
|
#23 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perché la libreria standard del C implementa solo funzionalità comuni per tutti i sistemi operativi (visto appunto che deve essere standard). Per questo funzionalità come queste devono essere richieste alle API o alle system call del sistema operativo, come appunto avviene sia in Linux che in Windows.
|
|
|
|
|
|
#24 | |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
Quote:
Attualmente utilizzo queste altre due funzioni che mi sembrano più precise ma vorrei sapere se voi ne conoscete altre. (non voglio che il tempo speso dal sistema operativo per fare le sue cose o passare la cpu da un processo all'altro venga sommato al tempo dell'algoritmo). double timer(){ struct tms hold; times(&hold); return (double)(hold.tms_utime) / (double) sysconf(_SC_CLK_TCK); } double timer2() { struct rusage r; getrusage(0, &r); return (double)(r.ru_utime.tv_sec+r.ru_utime.tv_usec/(double)1000000); } Le due funzioni restituiscono lo stesso tempo con uno scarto di 0.01. Fatemi sapere grazie.
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
|
|
|
|
|
|
#25 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Te vuoi il tempo CPU di ogni singolo processo ? Il tempo di CPU è diverso dal tempo reale. E' per questo che gettimeofday non ti funziona.
|
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
Esatto. A me interessa inserire nel codice C il calcolo del tempo di CPU trascorso dal momento in cui comincia a quello in cui mi stampa l'output. Ripeto le due funzioni che ho postato mi sembrano buone ma vorrei sapere se ne esistono altre che siano il meno possibile influenzate da quello che combina il sistema operativo (o altri programmi in esecuzione) durante l'esecuzione dell'algoritmo. Es. Se mentre gira il mio algoritmo ne lancio altri 3, ascolto la musica e leggo qualche file vorrei che il tempo di CPU calcolato non variasse di molti (un secondo-due secondi di tolleranza) rispetto a quello restituito quando l'algoritmo gira da solo.
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
|
|
|
|
|
#27 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
Nessuno mi può aiutare?
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
|
|
|
|
|
#28 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
Forse ho risolto il problema. A quanto pare l'hyperthreading dei processori intel può alterare (in base agli altri processi in running) il tempo di cpu. L'ho scoperto su un forum in cui veniva data questa risposta:
"Does your system have hyperthreading? (look at whether the siblings field in /proc/cpuinfo is greater than one) If yes, there is no way to accurately measure runtimes because the (single-threaded) performance of your CPU depends on the other tasks running. Just disable hyperthreading for these measurements." Ora ho disabilitato l'hyperthreading e le cose sembrano andare meglio (devo ancora fare un analisi approfondita dei risultati). Comunque a differenza di prima non mi segnala che i tre processi occupano CONTEMPORANEAMENTE il 99% di cpu ( visto che ciò è impossibile dato che le cpu sono solo due) ma una ne occupa il 99% e gli altri due il 50% ognuno.
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
|
|
|
|
|
#29 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In effetti è abbastanza strano. Non mi ero mai trovato davanti a problemi di questo tipo legati all'HT, ma devo dire che lasciano davvero increduli. Speriamo che nella prossima reintroduzione di qualcosa di simile all'HT (è in roadmap) prendano le dovute precauzioni.
|
|
|
|
|
|
#30 |
|
Senior Member
Iscritto dal: Nov 2006
Città: Salerno
Messaggi: 4256
|
da newbbo potreste rispiegarmi semplicemente come funziona sta roba del cronometrare l'esecuzione?
mi date le righe da incollare?
__________________
NABBA Italia Federazione Nazionale di Body Building, Fitness, Cultura sportiva, Educazione alimentare |
|
|
|
|
|
#31 | |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
Quote:
float timer(){ struct tms hold; times(&hold); return (double)(hold.tms_utime) / (double) sysconf(_SC_CLK_TCK); } Poi: main(){ float t; t = timer(); .... codice del tuo programma..... t = timer() - t; printf("Time: %.2f",t); }
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
|
|
|
|
|
|
#32 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma questo funziona solo con Linux
|
|
|
|
|
|
#33 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 869
|
Yes, ma thewebsurfer non ha specificato il sistema operativo usato. Per windows non ho idea di come fare.
__________________
Notebook: MBP 15 i7 Retina, (Mid 2014) |
|
|
|
|
|
#34 | |
|
Senior Member
Iscritto dal: Nov 2006
Città: Salerno
Messaggi: 4256
|
Quote:
__________________
NABBA Italia Federazione Nazionale di Body Building, Fitness, Cultura sportiva, Educazione alimentare |
|
|
|
|
|
|
#35 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:52.




















