PDA

View Full Version : [java] nanoTime()


seibi
02-07-2010, 17:16
ciao a tutti, implementando un test per la connessione tcp tra due client prendo un timestamp1 all'invio del mex dal client1 e ne prendo unaltro (timestamp2) alla ricezione del mex sul client2 e ne calcolo la differenza per ottenere il tempo impiegato alla trasmissione del pacchetto.

il problema è che su un pc il timestamp è dell'ordine di 10^12 mentre in un'altro è di 10^15 e di conseguenza il risultato della sottrazione mi da un valore non verosimile(qualcosa come 10^4 sec) dove è il problema?

i pc sono sincronizzati in orario al secondo.

grazie anticipatamente

nalsk
02-07-2010, 18:13
Non so il tuo problema mi fa pensare ad una discrepanza di versioni del JDK..anche se non ne sono per niente certo. Io avrei controllato la versione dei rispettivi JDK o JRE a seconda di quale usi. Se non dovesse bastare mi arrangerei cambiando a manina l'ordine di grandezza. :)

EDIT: ok su ho detto una fesseria.. se i due pc sono veramente sincronizzati al secondo (anche stessa data) non dovrebbero esserci differenze in alcun caso!

seibi
02-07-2010, 18:19
tutto sincronizzato....le versioni sono le stesse

astorcas
02-07-2010, 18:46
credo dipenda dalla risoluzione del timer di sistema :)

Tommo
02-07-2010, 21:52
E' che a nanotime() gli prende a male e restituisce valori negativi per un certo periodo di tempo, quindi finisci per fare
-10^12 - ( -10^15) = 10^3

Non chiedermi perchè fa così però :asd:

astorcas
02-07-2010, 22:50
E' che a nanotime() gli prende a male e restituisce valori negativi per un certo periodo di tempo, quindi finisci per fare
-10^12 - ( -10^15) = 10^3

Non chiedermi perchè fa così però :asd:

The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative)fonte (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#nanoTime())
:eek: :eek: :eek: ccheccavolovuoldire?

quindi fra due macchine nanotime non serve a na cippa? :asd:

seibi
03-07-2010, 00:03
The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative)fonte (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#nanoTime())
:eek: :eek: :eek: ccheccavolovuoldire?

quindi fra due macchine nanotime non serve a na cippa? :asd:

sai ke forse hai ragione

astorcas
03-07-2010, 10:24
-10^12 - ( -10^15) = 10^3


:eek: :confused: sei sicuro? :asd:

Tommo
03-07-2010, 10:39
:eek: :confused: sei sicuro? :asd:

MMMMH no :doh:

vabè cmq il succo è quello :asd:

wingman87
03-07-2010, 11:23
Penso che dovresti usare currentTimeMillis. Ad ogni modo non ho capito come hai fatto a sincronizzare perfettamente gli orari dei due computer.

seibi
03-07-2010, 14:15
Penso che dovresti usare currentTimeMillis. Ad ogni modo non ho capito come hai fatto a sincronizzare perfettamente gli orari dei due computer.

li ho semplicemente regolati nell'orologio di win... ci sarà discrepanza di mezzo secondo...cmq io ora per effettuare il test sui tempi di connessione TCP prendo due timeStamp, uno quando il client ha spedito e laltro quando il server ha ricevuto e poi faccio la differenza, è per questo che ho bisogno che i due pc siano sincronizzati...

...secondo voi è piu corretto mettere i timeStamp sulla stessa macchina?? e quindi prima e dopo la spedizione o prima/dopo la ricezione...

wingman87
03-07-2010, 14:56
La cosa migliore sarebbe calcolare il tempo di andata e ritorno, quindi sì sullo stesso pc, però fai partire il timer, invii il messaggio, arriva la risposta, fermi il timer. Lo fai un po' di volte e fai una media.
In ogni caso, avendo sincronizzato i pc in quel modo non ha senso ricorrere ad una precisione al nanosecondo. Al millisecondo è già fin troppo, anzi dubito che otterrai dei valori significativi in ogni caso con questo metodo.

__ZERO_UNO__
04-07-2010, 14:08
Puoi usare una istanza (due) della classe Calendar e i relativi metodi, sembra fatta appositamente....

PGI-Bis
04-07-2010, 16:06
nanotime misura intervalli di tempo, precisamente l'intervallo che occorre tra due invocazioni successive dello stesso metodo nanoTime. A differenza di currentTimeMillis il "timer" è inizializzato alla prima invocazione con un valore arbitrario. Così due nanoTime su macchine diverse restituiscono valori assolutamente incomparabili (mentre per currentTimeMillis si tratta sempre di un valore relativo ad una data prefissa rispetto alle impostazioni di sistema).

In ogni caso nanoTime è applicabile al tuo caso perchè il tuo caso è sensatamente gestibile solo se la misurazione avviene su un'unica macchina. Può essere chi invia, chi riceve o una terza macchina (un time server) ma sempre una dev'essere altrimenti la misurazione dipende da fattori che non puoi controllare.

Esegui un nanoTime quando invii la richiesta, ne esegui un'altro quando ricevi la risposta, la differenza tra i due è il tempo trascorso secondo la risoluzione della più precisa funzione di temporizzazione disponibile alla piattaforma (che potrebbe benissimo essere la stessa di currentTimeMillis). E questo rende irrilevante la sincronizzazione.

seibi
05-07-2010, 00:38
nanotime misura intervalli di tempo, precisamente l'intervallo che occorre tra due invocazioni successive dello stesso metodo nanoTime. A differenza di currentTimeMillis il "timer" è inizializzato alla prima invocazione con un valore arbitrario. Così due nanoTime su macchine diverse restituiscono valori assolutamente incomparabili (mentre per currentTimeMillis si tratta sempre di un valore relativo ad una data prefissa rispetto alle impostazioni di sistema).

In ogni caso nanoTime è applicabile al tuo caso perchè il tuo caso è sensatamente gestibile solo se la misurazione avviene su un'unica macchina. Può essere chi invia, chi riceve o una terza macchina (un time server) ma sempre una dev'essere altrimenti la misurazione dipende da fattori che non puoi controllare.

Esegui un nanoTime quando invii la richiesta, ne esegui un'altro quando ricevi la risposta, la differenza tra i due è il tempo trascorso secondo la risoluzione della più precisa funzione di temporizzazione disponibile alla piattaforma (che potrebbe benissimo essere la stessa di currentTimeMillis). E questo rende irrilevante la sincronizzazione.

grazie 1000 sei stato chiarissimo...farò come hai detto te con nanoTime