Repository 32bit  Forum
Repository 64bit  Wiki

[RISOLTO]C++: file ctime della libreria standard

Forum dedicato alla programmazione.

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.

[RISOLTO]C++: file ctime della libreria standard

Messaggioda N1cuz » sab dic 06, 2008 18:46

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?
Ultima modifica di N1cuz il lun dic 08, 2008 15:42, modificato 1 volta in totale.
Avatar utente
N1cuz
Linux 2.4
Linux 2.4
 
Messaggi: 279
Iscritto il: dom ott 05, 2008 23:41
Località: Pieve a Nievole (PT)
Nome Cognome: Nicola Bartolomei
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: kde/lxde

Re: C++: file ctime della libreria standard

Messaggioda mcosta » sab dic 06, 2008 18:59

Puoi sicuramente usaret la funzione di sistema
Codice: Seleziona tutto
gettimeofday()
che ti restituisce una struttura timeval che contiene secondi e microsecondi.
Avatar utente
mcosta
Linux 1.0
Linux 1.0
 
Messaggi: 54
Iscritto il: lun giu 14, 2004 23:00
Località: Marano (NA)
Nome Cognome: Massimo Costa
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: KDE 4.2.4

Re: C++: file ctime della libreria standard

Messaggioda N1cuz » sab dic 06, 2008 20:43

Il problema è che gettimeofday() memorizza la data in microsecondi, non è soggetta quindi a overflow???
Avatar utente
N1cuz
Linux 2.4
Linux 2.4
 
Messaggi: 279
Iscritto il: dom ott 05, 2008 23:41
Località: Pieve a Nievole (PT)
Nome Cognome: Nicola Bartolomei
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: kde/lxde

Re: C++: file ctime della libreria standard

Messaggioda targzeta » sab dic 06, 2008 21:02

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...
Questa non l'ho capita, dal man 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_SEC
Se la macro CLOCKS_PER_SEC contiene il numero di clock per secondo, non puoi fare una semplice divisione per ottenere la precisione che vuoi? Non sto capendo :-k

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6176
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: C++: file ctime della libreria standard

Messaggioda N1cuz » sab dic 06, 2008 21:49

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...
Avatar utente
N1cuz
Linux 2.4
Linux 2.4
 
Messaggi: 279
Iscritto il: dom ott 05, 2008 23:41
Località: Pieve a Nievole (PT)
Nome Cognome: Nicola Bartolomei
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: kde/lxde

Re: C++: file ctime della libreria standard

Messaggioda targzeta » dom dic 07, 2008 12:52

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...

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.

Leggi anche il
Codice: Seleziona tutto
man 1 time
e il
Codice: Seleziona tutto
man 2 times


Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6176
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: C++: file ctime della libreria standard

Messaggioda N1cuz » dom dic 07, 2008 16:19

spina ha scritto:
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...

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.

Leggi anche il
Codice: Seleziona tutto
man 1 time
e il
Codice: Seleziona tutto
man 2 times


Spina


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...
Avatar utente
N1cuz
Linux 2.4
Linux 2.4
 
Messaggi: 279
Iscritto il: dom ott 05, 2008 23:41
Località: Pieve a Nievole (PT)
Nome Cognome: Nicola Bartolomei
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: kde/lxde

Re: C++: file ctime della libreria standard

Messaggioda targzeta » dom dic 07, 2008 16:38

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...

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.

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6176
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: C++: file ctime della libreria standard

Messaggioda N1cuz » dom dic 07, 2008 17:37

spina ha scritto:
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...

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.

Spina

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...
Avatar utente
N1cuz
Linux 2.4
Linux 2.4
 
Messaggi: 279
Iscritto il: dom ott 05, 2008 23:41
Località: Pieve a Nievole (PT)
Nome Cognome: Nicola Bartolomei
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: kde/lxde

Re: C++: file ctime della libreria standard

Messaggioda mcosta » lun dic 08, 2008 12:17

N1cuz ha scritto:Il problema è che gettimeofday() memorizza la data in microsecondi, non è soggetta quindi a overflow???

La struttura timeval è composta così
Codice: Seleziona tutto
struct timeval {
               time_t      tv_sec;     /* seconds */
               suseconds_t tv_usec;    /* microseconds */
           };

e quindi i microsecondi vanno da 0 a 999999.

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;
 
Avatar utente
mcosta
Linux 1.0
Linux 1.0
 
Messaggi: 54
Iscritto il: lun giu 14, 2004 23:00
Località: Marano (NA)
Nome Cognome: Massimo Costa
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: KDE 4.2.4

Re: C++: file ctime della libreria standard

Messaggioda N1cuz » lun dic 08, 2008 14:19

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.
Avatar utente
N1cuz
Linux 2.4
Linux 2.4
 
Messaggi: 279
Iscritto il: dom ott 05, 2008 23:41
Località: Pieve a Nievole (PT)
Nome Cognome: Nicola Bartolomei
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: kde/lxde


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite