Newsgroup: it.comp.os.linux.development
Titolo: clock()

Buonasera,
potete dirmi come si fa a calcolare il tempo in millesimi di secondo
col C nel proprio pc e con Ubuntu?
Io ho questo codice (scusate se e' un po' lungo):
*********************************************
/* cambiamonete */
#include <stdio.h>
#include <time.h>
const int max_t = 50000;
int tagli[15]={1,2,5,10,20,50,100,200,500,1000,2000,5000,10000,20000,50000};
int somma, i,j;
long double totale;
long double cambia(int,int[]);
long double conta[50000+40000+1][16];
int main(void)
{
somma = 1;
while (somma != -123456)
{
printf("\n\nsomma  = ");
scanf("%d",&somma);
clock_t inizio, fine;
double durata;
inizio = clock();
for(i=0; i<16; i++)
{
conta[max_t][i]=1;
}
for(i=0;i<(somma+1);i++)
{
for(j=1; j<16; j++)
{
conta[max_t+i][j] = conta[i - tagli[j-1] + max_t][j] + conta[i+max_t][j-1];
}}
fine = clock();
durata = ((double) (fine - inizio))*100;
printf("durata = %e",durata);
totale = conta[somma+max_t][14];
printf("\ntotale = %.0Lf",totale);
} /* while */
return 0;
} /* main */
*************************************************
pero' il tempo me lo sbaglia, lo so perche' lo calcolo anche con il
comando time, nel manuale parla di cicli di cpu... ora vi chiedo come
posso saperlo?
(se poi per caso date un'occhiata al codice e trovate altri errori mi
fate un grosso piacere se me lo dite - grazie in anticipo)
-- 
ciao Mario

gettimeofday() ti restituisce il tempo corrente fino al microsecondo (anche 
se la risoluzione non e' specificata), puoi usare quella.
Pleg

Mario ha scritto:

Per i millesimi c'ï¿œ ftime, che perï¿œ credo sia obsoleta.
Per i microsecondi, come diceva giustamente Pleg, c'ï¿œ gettimeofday, che 
ï¿œ la cosa piï¿œ sensata, e tra l'altro al giorno d'oggi si usa spesso e 
volentieri per implementare ftime; per gli sborroni c'ï¿œ clock_gettime ;D
Tieni conto che queste funzioni nel risultato spezzano la parte intera 
da quella decimale, per cui fai attenzione poi quando fai le differenze:
o converti in virgola mobile ('nsomma...), o ti tocca scriverti un 
pochino di codice, perchï¿œ per esempio 10.2 - 9.3 != 1.-1 ("uno virgola 
meno uno")
lb

meno uno")
Ringrazio entrambi pero' ho risolto diversamente e sembra che vada bene
perche' e' d'accordo col valore user del time buil-in.
Mi e' bastato aggiungere come ultima e unica istruzione e senza nessuna
variabile o altro prima, questa sola semplicissima riga:
prinf("\ndurata = %ld\n,clock());
incredibile eh? pero' l'ho trasformata cosi' perche' non voglio tutti
quegli zeri:
prinf("\ndurata = %.2f\n,(double)clock()/1000000);
(ovviamente c'ho messo anche la direttiva #INCLUDE <time.h>)
Non ci capisco niente di C ma sto cercando d'impararlo con questi
programmini e mi sa che clock() il tempo se lo fa passare dal so
perche' va sempre sincrono con time tranne che taglia i millesimi
di secondo.
Cioe' voglio dire che il problema mio non era un problema perche' e' la
clock() stessa che traduce i cicli della cpu, mi sembra.
-- 
ciao Mario

http://www.opengroup.org/onlinepubs/009695399/functions/clock.html
Se davvero vuoi il tempo "utente" (quello, insomma, che vedi tu) non mi 
sembra una buona idea. Meglio gettimeofday.
Pleg

 o converti in virgola mobile ('nsomma...)
Io faccio sempre cosi', converto in virgola mobile. Tanto non credo che il 
tempo che ti da' sia effettivamente preciso al microsecondo, convertendo non 
perdi niente.
Anzi, proviamo a far due conti: il double ha 53 bit di mantissa (contando 
quello implicito), che significa che puo' rappresentare esattamente i nostri 
microsecondi (valori interi) fino a 2^53 us = 9*10^15 us = 9*10^9 secondi = 
circa 285 anni. Quindi, dato che epoch e' nel 1970, siamo perfettamente 
coperti: la conversione in double non perde nessuna cifra significativa.
Correggetemi se ho detto cazzate :D
Pleg