[RISOLTO]C++: file ctime della libreria standard
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
[RISOLTO]C++: file ctime della libreria standard
Ho un problema, dovrei realizzare una classe "Timer" che misuri il tempo di esecuzione di un algoritmo, sfruttando le funzioni time() e/o clock() per poter apprezzare fino a 1 / 10000 sec. Con la funzione time() arrivo solo ai secondi (anche se dovrebbe essere possibile con un artificio che non conosco, ottenere la precisione desiderata), mentre con clock() sono riuscito ad arrivare al centesimo di secondo, perchè non viene contato ogni singolo colpo di clock, ma viene effettuato un conteggio ogni cento colpi di clock.
Nessuno ha un idea di come poter ottenere una stima del tempo di esecuzione così precisa?
Nessuno ha un idea di come poter ottenere una stima del tempo di esecuzione così precisa?
Ultima modifica di N1cuz il lun 8 dic 2008, 15:42, modificato 1 volta in totale.
- mcosta
- Linux 0.x

- Messaggi: 54
- Iscritto il: mar 15 giu 2004, 0:00
- Nome Cognome: Massimo Costa
- Slackware: 13.0
- Kernel: 2.6.29.6
- Desktop: KDE 4.2.4
- Località: Marano (NA)
Re: C++: file ctime della libreria standard
Puoi sicuramente usaret la funzione di sistema che ti restituisce una struttura timeval che contiene secondi e microsecondi.
Codice: Seleziona tutto
gettimeofday()- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++: file ctime della libreria standard
Il problema è che gettimeofday() memorizza la data in microsecondi, non è soggetta quindi a overflow???
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: C++: file ctime della libreria standard
Questa non l'ho capita, dal man di clock:N1cuz ha scritto:...mentre con clock() sono riuscito ad arrivare al centesimo di secondo, perchè non viene contato ogni singolo colpo di clock, ma viene effettuato un conteggio ogni cento colpi di clock...
Codice: Seleziona tutto
...
The clock() function returns an approximation of processor time used by the program.
...
The value returned is the CPU time used so far as a clock_t; to get the number of seconds used, divide by CLOCKS_PER_SECSpina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++: file ctime della libreria standard
Purtroppo no, al massimo arrivi al centesimo di secondo perchè il valore di ritorno della funzione clock() è approssimato, cioè tiene di conto 100 colpi di clock non i singoli colpi di clock, per capirsi da 0 a 99 colpi di clock, il valore restituito da clock() è 0, quindi il numero di colpi di clock al millesimo di secondo è trascurato...
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: C++: file ctime della libreria standard
Abbi pazienza N1cuz ma ancora non capisco. Tu chiedi una precisione di 10 alla -4, se hai un processore che lavora sull'ordine dei GHz vuol dire che ogni secondo il processore esegue 10 alla -9 clock, ora ammesso e non concesso che la funzione clock() ritorni il numero di clock diviso 100 (dove lo hai letto?), vuol dire che la prima cifra significata ce l'hai a 10 alla -7, che è ben oltre quello che cerchi tu.N1cuz ha scritto:Purtroppo no, al massimo arrivi al centesimo di secondo perchè il valore di ritorno della funzione clock() è approssimato, cioè tiene di conto 100 colpi di clock non i singoli colpi di clock, per capirsi da 0 a 99 colpi di clock, il valore restituito da clock() è 0, quindi il numero di colpi di clock al millesimo di secondo è trascurato...
Leggi anche il
Codice: Seleziona tutto
man 1 timeCodice: Seleziona tutto
man 2 timesSe pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++: file ctime della libreria standard
Non so come mai anche se la cpu lavora sul Ghz, il valore ritornato dalla macro CLOCKS_PER_SEC è 10 alla 6, quindi i millesimi di secondo vengono valutati 0 oppure 9, a seconda dell'approssimazione che viene fatta, per quanto riguarda la funzione clock(), ho verificato sperimentalmente ciclando un unica istruzione di stampa del valore di ritorno di clock(), adesso provo a vedere il man...spina ha scritto:Abbi pazienza N1cuz ma ancora non capisco. Tu chiedi una precisione di 10 alla -4, se hai un processore che lavora sull'ordine dei GHz vuol dire che ogni secondo il processore esegue 10 alla -9 clock, ora ammesso e non concesso che la funzione clock() ritorni il numero di clock diviso 100 (dove lo hai letto?), vuol dire che la prima cifra significata ce l'hai a 10 alla -7, che è ben oltre quello che cerchi tu.N1cuz ha scritto:Purtroppo no, al massimo arrivi al centesimo di secondo perchè il valore di ritorno della funzione clock() è approssimato, cioè tiene di conto 100 colpi di clock non i singoli colpi di clock, per capirsi da 0 a 99 colpi di clock, il valore restituito da clock() è 0, quindi il numero di colpi di clock al millesimo di secondo è trascurato...
Leggi anche ile ilCodice: Seleziona tutto
man 1 timeSpinaCodice: Seleziona tutto
man 2 times
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: C++: file ctime della libreria standard
Hai ragione, il valore è per tutti 10 alla 6, ecco forse perchè è una approssimazione. Però il valore ritornato dalla funzione clock non dovrebbe essere corretto uguale? Inoltre, 10 alla 6 diviso 10 alla meno 2 fa 10 alla 4, che è l'approssimazione che cercavi.N1cuz ha scritto:...
Non so come mai anche se la cpu lavora sul Ghz, il valore ritornato dalla macro CLOCKS_PER_SEC è 10 alla 6, quindi i millesimi di secondo vengono valutati 0 oppure 9, a seconda dell'approssimazione che viene fatta, per quanto riguarda la funzione clock(), ho verificato sperimentalmente ciclando un unica istruzione di stampa del valore di ritorno di clock(), adesso provo a vedere il man...
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++: file ctime della libreria standard
Hai ragione, ma ho sbagliato in realtà i colpi di clock non trascurabili sono dell'ordine dei 10000, valori inferiori vengono trascurati, per cui con questo sistema non si fa di meglio, comunque il mio prof di informatica sostiene che si può usare time(), con un piccolo artificio (che ovviamente non rivela) per ottenere la precisione richiesta, ho provato a leggere la documentazione delle std library, ma mi pare che le stime con time() siano addirittura più grossolane...spina ha scritto:Hai ragione, il valore è per tutti 10 alla 6, ecco forse perchè è una approssimazione. Però il valore ritornato dalla funzione clock non dovrebbe essere corretto uguale? Inoltre, 10 alla 6 diviso 10 alla meno 2 fa 10 alla 4, che è l'approssimazione che cercavi.N1cuz ha scritto:...
Non so come mai anche se la cpu lavora sul Ghz, il valore ritornato dalla macro CLOCKS_PER_SEC è 10 alla 6, quindi i millesimi di secondo vengono valutati 0 oppure 9, a seconda dell'approssimazione che viene fatta, per quanto riguarda la funzione clock(), ho verificato sperimentalmente ciclando un unica istruzione di stampa del valore di ritorno di clock(), adesso provo a vedere il man...
Spina
- mcosta
- Linux 0.x

- Messaggi: 54
- Iscritto il: mar 15 giu 2004, 0:00
- Nome Cognome: Massimo Costa
- Slackware: 13.0
- Kernel: 2.6.29.6
- Desktop: KDE 4.2.4
- Località: Marano (NA)
Re: C++: file ctime della libreria standard
La struttura timeval è composta cosìN1cuz ha scritto:Il problema è che gettimeofday() memorizza la data in microsecondi, non è soggetta quindi a overflow???
Codice: Seleziona tutto
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
Ovviamente se vuoi contare tutto in microsecondi devi usare un intero a 64 bit.
Esempio
Codice: Seleziona tutto
#include <stdint.h>
struct timeval now;
gettimeofday(&now, 0);
int64_t usecs = now.tv_sec * 1000000 + now.tv_usecs;
- N1cuz
- Linux 2.x

- Messaggi: 333
- Iscritto il: lun 6 ott 2008, 0:41
- Nome Cognome: Nicola Bartolomei
- Slackware: 14.1
- Kernel: 4.3.3
- Desktop: xfce4
- Località: Pieve a Nievole (PT)
Re: C++: file ctime della libreria standard
Non sapevo esistesse una rappresentazione a 64bit degli interi, comunque a me basta anche una rappresentazione in secondi con quattro cifre decimali quindi posso usare tranquillamente i double.
Anche se il prof chiedeva l'uso della funzione time() della libreria standard questa mi pare l' unica soluzione per ottenere una precisione piuttosto alta (anche se poi non accuratissima), quindi o gli va bene così o pace! Grazie a tutti per l'aiuto.
Anche se il prof chiedeva l'uso della funzione time() della libreria standard questa mi pare l' unica soluzione per ottenere una precisione piuttosto alta (anche se poi non accuratissima), quindi o gli va bene così o pace! Grazie a tutti per l'aiuto.