Newsgroup: it.comp.lang.c
Titolo: clock

#include <stdio.h>
#include <time.h>
main()
{unsigned long a;
for(a=0;a<844;a++);
a=clock(); 
printf("clock=%u\n",a);
return 1;
}
Perchè mi scrive clock=0 e non i cicli del clock (borland5.5)?
(e neanche -1 se cambio a in int)

Perchè mi scrive clock=0 e non i cicli del clock (borland5.5)?
844 e' un numero decisamente troppo piccolo per essere una
misurazione interessante. clock() non torna i cicli di clock
della CPU ma una misurazione del tempo che dipende dal
compilatore (tu sai che ci sono CLOCKS_PER_SEC colpi di
questo clock in un secondo; nel tuo caso il PC riesce a fare
844 loop prima ancora che clock() si sia mosso).
Normalmente il numero CLOCKS_PER_SEC non e' altissimo e quindi
per fare delle misurazioni devi usare elaborazioni piu' lunghe.
Ti consiglio anche di misurare usare clock() per differenza ...
  a=clock();     // inizio
  ... elaborazione ...
  a=clock() - a; // tempo totale
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 misurazione interessante. 
aggiungerei inoltre che molti compilatori ottimizzano via tale ciclo, 
di solito con un 
mov eax, 843



non conosco l'assembler cmq non mi sembra un'ottimizzazione

 non conosco l'assembler cmq non mi sembra un'ottimizzazione
   Se tu presenti al compilatore un'istruzione del genere, non puoi 
impedirgli di pensare che hai cercato un modo contorto (non ottimizzato) 
di assegnare il valore 833 alla variabile a. In fondo, e` pur sempre una 
macchina...
--
Alla prossima,
Marco



Essendo a una variabile locale il compilatore e' autorizzato
a rimuovere quel loop "inutile" per assegnare direttamente
il valore finale (che comunque e' 844 e non 843).
L'ordine e il modo con cui vengono modificate le variabili
locali non visibili all'esterno non fa parte delle cose che
un compilatore e' tenuto a mantenere inalterato rispetto al
sorgente (ed e' meglio cosi'... questo offre al compilatore
molte opportunita' di ottimizzare il codice).
Per obbligare il compilatore a fare un loop "vuoto" devi
dichiarare la variabile come "volatile". In questo modo
obblighi il compilatore a rispettare tutte le tue richieste
di scrittura e lettura su quella variabile (con "volatile"
dici al compilatore che quella variabile e' in qualche modo
speciale e deve essere letta/scritta esattamente come
hai richiesto).


 wrote in message
news:3bad93db...@news.tin.it...

printf: usa %lu (dichiarato unsigned long, ma il tuo printf interpreta
unsigned che potrebbe essere
sbagliato se sizeof(unsigned int) e sizeof(unsigned long) non sono uguali)

mov eax, 843
844, per la precisione. :-)
-- 
Saluti,
    Mardy
http://castellina.org/interlingua

sbagliato se sizeof(unsigned int) e sizeof(unsigned long) non sono uguali)
in questo caso mi sembra che la situazione non varia; cmq questo fatto
delle conversioni è importante per esempio: è possibile che clock()
restituisca un tipo di dimensione > di 32 bit o di tipo non unsigned?
Ci sono stati problemi di conversione che *sembrano* spariti quando ho
posto: k=k & 4294967295;



Non capisco lo scopo di questo programma.
Se devi cronometrare il loop devi scrivere qualcosa del tipo:
start = clock();
... /* codice */
elapsed = clock() - start;
Inoltre tieni presente che la granularita' del timer e' in genere di
976 microsecondi (milionesimi di secondo).
Il ciclo 'for' che hai utilizzato probabilmente e' molto piu' breve.
ciao, acc.   
a...@libero.it