PDA

Visualizza versione completa : [Java] System.currentTimeMillis()


Dav82
28-07-2004, 18.28.35
Ragazzi, mi serve un aiuto! :(

Non riesco ad avere dei risultati decenti dalla funzione System.currentTimeMillis(). Sembra che conosca solo i multipli di 15 o 16. Dopo un'oretta di test vari (per il benchmark, non è ancora finito eh! :p) mi sono venuti un po' di dubbi sul suo funzionamento e in effetti... ho buttato giù ste due righe per aver conferma:


public static void main(String[] args) {
long inizio = 0;
long fine = 0;
Object a = null;

for (int j=0; j<30; j++){
inizio = System.currentTimeMillis();
System.out.print(inizio + " ");

for (long i=0; i<(100000 + j*3000); i++)
a = new Object();

fine = System.currentTimeMillis();
System.out.println(fine);

System.out.println(j + " " + (fine-inizio));
}
}

e questo è l'output:

1091031872828 1091031872843
0 15
1091031872843 1091031872843
1 0
1091031872843 1091031872843
2 0
1091031872843 1091031872859
3 16
1091031872859 1091031872859
4 0
1091031872859 1091031872859
5 0
1091031872859 1091031872859
6 0
1091031872859 1091031872859
7 0
1091031872859 1091031872859
8 0
1091031872859 1091031872875
9 16
1091031872875 1091031872875
10 0


vi risparmio la continuazione dell'output tanto ci siamo capiti... non riesce a conteggiare i millisecondi, ma va a salti di 15 o 16...

Che cosa posso fare??? :(

Dav82
28-07-2004, 18.51.05
Mi do una parziale risposta da solo:


Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond, the granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems measure time in units of tens of milliseconds

Ma come faccio allora? :(
Devo misurare delle cose che durano poche decine di ms, e se mi quantizza in blocchi da 15ms non riesco a fare un tubo! :crying:

Sergio Neddi
28-07-2004, 21.36.33
E ti è andata bene.

Pensa che l'orologio dei PC (parlo di quelli originali, gli "antichi" 8088) anche se poteva segnare i centesimi di secondo in realtà veniva aggiornato circa ogni diciottesimo (se non erro) di secondo e quindi circa ogni 55 ms in quanto questa era la frequenza del timer che generava l'interrupt.

Ora molte cose nei PC sono cambiate, ma non credo che sia facile fare misure così precise senza utilizzare un'hardware dedicato.

Ricordo che antichi trucchi di programmazione leggevano il contatore di riga della scheda video (tanto erano solo CGA o Hercules, rare EGA) per ricavarsi temporizzazioni più veloci.

Dav82
28-07-2004, 21.55.09
Grazie Sergio! :)

Quindi l'unica cosa da fare (come ho già fatto) è usare questo meccanismo ovvissimo: fare eseguire lo stesso compito più volte ripetutamente, calcolare il tempo totale e poi dividere...

sigh :(

Sergio Neddi
28-07-2004, 22.04.05
Si, questo si fa in molti casi, ma non sempre è possibile, se si deve misurare una cosa molto breve e non ripetitiva è impossibile.

E comunque fa perdere un sacco di tempo per niente.

pholcus
10-08-2004, 17.13.28
mmm...

Credo tu possa provare ad usare linux invece che windows..
su Linux&C. di questo mese c'e' un articolo su come modificare poche righe del codice del kernel e creare un modulo per ottenere un sistema "soft realtime", aumentando la frequenza degli interrupt e di conseguenza la risoluzione..viene cambiato anche il tipo di schedulazione..

Ora nn ho sottomano linux&c. e nn sono a casa fino a settembre..cmnq appena ti rispondo di nuovo..

Appena posso provo il programma sotto linux e vedo se va meglio..

ciao

Dav82
10-08-2004, 17.19.00
Grazie mille pholcus! :) (Y)

Sono quasi totalmente a digiuno di pinguini, ma visto che mi dici così... potrei farci un pensierino! :)


Purtroppo il sistema dovrà cmq girare su qualsiasi piattaforma, e in particolare uno dei server che saranno utilizzati più spesso è Win.
Sarebbe però interessante lo stesso per fare delle rilevazioni magari più approfondite.

Aspetto altre notizie e intanto cerco anch'io!
Grazie! :)

P8257 WebMaster
11-08-2004, 01.26.23
E' un problema che ho riscontrato anch'io sotto Windows, non è soltanto in Java, anche se fai roba nativa in C++ ad esempio e vuoi scrivere una funzione che fa un polling per 'n' millisecondi, basandoti sul sistema vedi che c'é un certo margine tra le rilevazioni... credo che non si possa ottenere una precisione più accurata .. almeno sotto Windows...

Bye :cool: