Newsgroup: it.comp.lang.c
Titolo: misure di tempo PRECISE

Salve a tutti.
Avrei bisogno di misurare in modo abbastanza preciso (microsecondo) dei
tempi all'interno di un programma in C per MSDOS (16 bit!); nel
compilatoreche uso (Borland C/C++ 3.1) c'è solo la funzione clock() che però
ha una risoluzione troppo bassa... qualcuno ha per caso una funzioncina che
faccia al caso mio?
Grazie!
            Giovanni
-----------------------------------------------------------------------
La mia homepage: 
http://go.to/gizangro
Le nostre foto dell'eclisse: 
http://go.to/eclisse99
VOTA IL MIO SITO NELLA CLASSIFICA
DEI SITI ASTRONOMICI!
-----------------------------------------------------------------------
Us and them
and after all we're only ordinary men... (PF)
-----------------------------------------------------------------------

Se almeno la CPU č recente, c'č un'istruzione che restituisce il numero di
cicli di clock. Piů preciso di cosě...
Solo che al momento non ricordo come si chiami :-(
Se qualcuno mi aiuta...
Se invece hai una CPU vecchia, il meglio che puoi fare č usare qualche
truccetto per migliorare la risoluzione temporale delle istruzioni di
libreria (che si appoggiano invece al timer di sistema, preciso, si fa per
dire, al 18esimo di secondo).
In pratica devi attendere il timer tick, poi far partire un ciclo che
attende il nuovo timer tick, e contare il numero di esecuzioni.
Per misurare, poi, aspetti il tick, fai quello che devi contando i tick che
nel frattempo vengono eseguiti, poi conti quanti cicli esegui prima del
prossimo tick.
Detto N il numero di cicli che esegui tra un tick e l'altro, T il numero di
tick che capitano durante la tua funzione, e R i cicli che esegui prima del
tick successivo alla terminazione della tua procedura, ottieni che il tempo
trascorso č di:
    T*18 + R/N secondi
Ovviamente, non puoi fare affidamento sulla precisione assoluta, ma hai una
buona approssimazione.
Se invece devi semplicemente far trascorrere un certo tempo, basta che fai
un ciclo con
(tempo desiderato in secondi) * (N*18)
ripetizioni
Ciao
--
Alessandro Monti

 ....[snip]...

> Qualcuno si ricorda per caso l'istruzione? :-)
RDTSC
Opcode: 0F 31
Carica in EDX:EAX il valore a 64 bit MSR che tiene conto del numero di cicli
di clock trascorsi dall'accensione o dall'ultimo reset.
Potrebbe essere disabilitato con il flag TSD del registro CR4, che se posto
a uno vieta l'esecuzione ell'istruzione ai livelli di privilegio maggiori di
zero.
E' stata introdotta con i Pentium, per cui dovresti averla, se non è vietata
dal SO. Tieni conto che la documentazione dice che non può essere affidabile
al 100%, perchè non aspetta il prossimo ciclo prima di dare il risultato, e
qualche ciclo potrebbe essere eseguito prima che ritorni il risultato.
Se l'istruzione non può essere eseguito ritorna un eccezione GP(0), ma non
credo sia interessante.
Spero di essere stato utile.
Ciao
--
Alessandro Monti

 un Pentium-s 120 MHZ, quindi abbastanza recente!
Esattamente come il mio. Ma io lo considero ultra-obsoleto, non
"abbastanza recente". In giro ho visto dei 700 Mhz... :-)
EMG

Alessandro Monti
Saluti,
    Mardy

 Si puo' aumentare, anzi 18,2 e' proprio la frequenza minima.
Attenzione, però, a cosa può succedere :-)
--
Alessandro Monti

...

No, non credo ci siano problemi; l'importante e' che se, per esempio, si fa
andare il timer 36,4 volte al secondo ci si ricordo di richiamare la vecchia
routine una volta ogni due, ma anche questo e' solo "buona educazione", non
e' obbligatorio. :-)
Saluti,
    Mardy

 e' obbligatorio. :-)
Certo, ma qualche altro programma potrebbe avere avuto la stessa pensata con
altrettanta educazione. E smetterebbe di funzionare...
Diciamo allora che prima di tutto bisognerebbe anche testare a quale
frequenza è attualmente settato e agire di conseguenza.
Mi parrebbe più semplice cercare strade più pulite e che oltretutto danno
risultati migliori, no?
--
Alessandro Monti

>Qualcuno si ricorda per caso l'istruzione? :-)
rdtsc, sul sito Papero trovi anche del codice d'esempio
-------------------------------------------------------
Tieni per te il Papero se vuoi la mia email
Sito Papero -> 
http://utenti.tripod.it/papero

risultati migliori, no?
Certo, volevo solo ampliare quello che gia' tu avevi detto sul timer. :-)
Saluti,
    Mardy