2011-12-05 2 views
5

Esiste un modo per ottenere tempo di sistema ad alta precisione in python?Tempo di sistema ad alta precisione in python

Ho una piccola applicazione per funzionare con la porta COM virtuale. Voglio misurare l'intervallo di tempo tra l'invio del messaggio e il suo ricevimento.

Al momento funziona così:

ottengo il messaggio, utilizzare

time.time() 

e aggiungere le sue 20 cifre al messaggio. L'applicazione client riceve questo messaggio e ottiene

time.time() 

di nuovo, quindi calcola le loro differenze. Al più dei casi l'intervallo di tempo (come mi aspettavo) è uguale a zero.

La domanda è: esiste un modo per farlo in modo più intelligente e con maggiore precisione?

+0

Se il mittente e il destinatario sono su macchine diverse, come si fa a gestire le diverse basi dei tempi? In ogni caso, il driver della porta seriale invierà il messaggio ogni volta che lo si sente, il che è estremamente variabile (10 di millisecondi, nella mia esperienza). – mtrw

+0

il mittente e il destinatario si trovano sulla stessa macchina (sto usando le porte COM virtuali). il programma è scritto per scopi didattici, quindi sto chiedendo se c'è un modo intelligente per risolvere questo problema. –

+0

correlati: http://bugs.python.org/issue10278 [time.walltime() in C] (http: // bugs.python.org/review/10278/patch/3730/11849), [in Python chiama clock_gettime() usando ctypes] (http://stackoverflow.com/a/1205762/4279) – jfs

risposta

2

Ecco un estratto da time.clock

In Unix, restituisce il tempo di processore corrente come un numero in virgola mobile espresso in secondi. La precisione, e in effetti la stessa definizione di "tempo del processore", dipende da quella della funzione C con lo stesso nome, ma in ogni caso, questa è la funzione di uso per il benchmarking Python o algoritmi di temporizzazione.

Su Windows, questa funzione restituisce i secondi di orologio a muro trascorsi dalla prima chiamata a questa funzione, come numero a virgola mobile, in base a la funzione Win32 QueryPerformanceCounter(). La risoluzione è in genere migliore di un microsecondo.

(enfasi mio)

+0

grazie mille per la tua risposta, ma il client e le applicazioni del mittente funzionano come processi diversi. quindi, come posso usare questa funzione per calcolare l'intervallo di tempo? –

+0

Davvero non saprei dire. La migliore possibilità sarebbe avere il blocco '' 'send''' fino a quando il messaggio non viene ricevuto, così puoi prendere il tempo prima e dopo. Un modo per farlo sarebbe prevedere una risposta, ma ciò influenzerebbe i risultati. L'altra opzione è l'invio di un messaggio molto lungo che richiederebbe alcuni minuti per la trasmissione, in modo che '' 'time.time()' '' abbia una precisione sufficiente. Spero davvero che qualcuno trovi una soluzione migliore ... – FakeRainBrigand

+0

Calibrare QueryPerformanceCounter contro time.time all'inizio del codice, quindi il timestamp inviato sarà una versione di time.time() di alta precisione. Vale un tentativo! –