OVH Cloud OVH Cloud

sleep ....

7 réponses
Avatar
Gaetan Rey
Apres quelques tests sur les sleep (en java), j'ai remarqué un
comportement etrange.

la classe suivante fait une boucle qui attend x millisecondes
et incremente une valeur de 1... elle fait cela 5000 fois.

public class TestThread extends Thread {
int sleepTime;

public TestThread (int sleepTime) {
this.sleepTime = sleepTime;
this.start ();
}
public void run () {
int nbTest = 0;
int sleepTime = this.sleepTime;;
long begin = System.currentTimeMillis ();

while (nbTest < 5000) {
try {
sleep (sleepTime);
} catch (Exception e) {}
nbTest ++;
}
long time = System.currentTimeMillis ();
System.out.println ("average = "+((double)(time - begin)) /
(double)nbTest);
}

public static void main (String [] args) {

if (args.length == 1) {
System.out.println ("SleepTime = "+Integer.parseInt (args[0]));
new TestThread (Integer.parseInt (args[0]));
}
}
}

voila les resultats obtenues
SleepTime = 1
average = 1.9594

SleepTime = 5
average = 5.872

SleepTime = 30
average = 31.25

ce qui semble jusque la normal (de l'ordre de 1 ms d'ecart en moyenne)
regardons maintenant des sleep de 10 ou 20 ms
SleepTime = 10
average = 15.625
soit une erreur moyenne de 5 ms par sleep

SleepTime = 20
average = 31.25

pourquoi de tel erreur ?
j'utilise la dernier version de la jvm 1.4.2 sous windows XP

merci de votre aide

Gaetan

7 réponses

Avatar
Marc Petit-Huguenin
Gaetan Rey wrote:
Apres quelques tests sur les sleep (en java), j'ai remarqué un
comportement etrange.

la classe suivante fait une boucle qui attend x millisecondes
et incremente une valeur de 1... elle fait cela 5000 fois.



[snip]


voila les resultats obtenues
SleepTime = 1
average = 1.9594

SleepTime = 5
average = 5.872

SleepTime = 30
average = 31.25

ce qui semble jusque la normal (de l'ordre de 1 ms d'ecart en moyenne)
regardons maintenant des sleep de 10 ou 20 ms
SleepTime = 10
average = 15.625
soit une erreur moyenne de 5 ms par sleep

SleepTime = 20
average = 31.25

pourquoi de tel erreur ?
j'utilise la dernier version de la jvm 1.4.2 sous windows XP


Les meme tests sous GNU/Linux avec un kernel 2.6 donnent:

SleepTime = 10
average = 11.072

SleepTime = 20
average = 21.5912

Avec la JVM 1.5.0beta1, sous le meme OS:

SleepTime = 10
average = 11.1012

SleepTime = 20
average = 21.588


Mauvais OS, changer OS.


merci de votre aide

Gaetan



Avatar
Gaetan Rey
merci pour toutes ces informations
grace à toi l'informatique fait un grand pas en avant !!!

Cordialement

Gaetan

Marc Petit-Huguenin wrote:
Les meme tests sous GNU/Linux avec un kernel 2.6 donnent:

SleepTime = 10
average = 11.072

SleepTime = 20
average = 21.5912

Avec la JVM 1.5.0beta1, sous le meme OS:

SleepTime = 10
average = 11.1012

SleepTime = 20
average = 21.588


Mauvais OS, changer OS.



Avatar
Lionel
Marc Petit-Huguenin wrote:

Les meme tests sous GNU/Linux avec un kernel 2.6 donnent:


mes valeurs sous winXP SP
Classic VM (build 1.3.1, J2RE 1.3.1 IBM Windows 32 build cn131-20020710

SleepTime = 10
average = 11.072


10.747

SleepTime = 20
average = 21.5912


20.5094

Mauvais OS, changer OS.


conclusion: winXP c'est mieux que linux.

LOL

Avatar
Unknown
Le Thu, 27 May 2004 12:36:44 +0200, Gaetan Rey a écrit :

Apres quelques tests sur les sleep (en java), j'ai remarqué un
comportement etrange.

la classe suivante fait une boucle qui attend x millisecondes
et incremente une valeur de 1... elle fait cela 5000 fois.


Tout ça est normal, lit la javadoc :

public static long currentTimeMillis()

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.

Avatar
Auge Frederic
Unknown wrote:


Apres quelques tests sur les sleep (en java), j'ai remarqué un
comportement etrange.

la classe suivante fait une boucle qui attend x millisecondes
et incremente une valeur de 1... elle fait cela 5000 fois.



Tout ça est normal, lit la javadoc :

public static long currentTimeMillis()

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.




ni Windows, ni Linux ne sont des OS temps réel, donc la précision est
relative.


Avatar
Thibault Cuvillier
Gaetan,

Windows ne sait pas mesurer le temps a la ms.

Voici un test simple:
long start = System.currentTimeMillis();

long previous = -1;
while(true) {
long now = System.currentTimeMillis() - start;
if( now > 10000 ) break;
if( now != previous ) {
System.out.println(now);
previous = now;
}
}

Resultat sous Linux (Mandrake 10):
0
1
2
3
4
5
6
7
8

Resultat sous Windows XP (sur la meme machine):
0
10
20
30
40
50

Windows XP ne mesure pas le nombre de ms, mais le nombre de "time
slice", tranche de temps utilisé par le scheduler du noyau pour répartir
le temps CPU aux différents processus.

Thibault Cuvillier
http://www.b-technology.biz


Gaetan Rey wrote:
Apres quelques tests sur les sleep (en java), j'ai remarqué un
comportement etrange.

la classe suivante fait une boucle qui attend x millisecondes
et incremente une valeur de 1... elle fait cela 5000 fois.

public class TestThread extends Thread {
int sleepTime;

public TestThread (int sleepTime) {
this.sleepTime = sleepTime;
this.start ();
}
public void run () {
int nbTest = 0;
int sleepTime = this.sleepTime;;
long begin = System.currentTimeMillis ();

while (nbTest < 5000) {
try {
sleep (sleepTime);
} catch (Exception e) {}
nbTest ++;
}
long time = System.currentTimeMillis ();
System.out.println ("average = "+((double)(time - begin)) /
(double)nbTest);
}

public static void main (String [] args) {

if (args.length == 1) {
System.out.println ("SleepTime = "+Integer.parseInt (args[0]));
new TestThread (Integer.parseInt (args[0]));
}
}
}

voila les resultats obtenues
SleepTime = 1
average = 1.9594

SleepTime = 5
average = 5.872

SleepTime = 30
average = 31.25

ce qui semble jusque la normal (de l'ordre de 1 ms d'ecart en moyenne)
regardons maintenant des sleep de 10 ou 20 ms
SleepTime = 10
average = 15.625
soit une erreur moyenne de 5 ms par sleep

SleepTime = 20
average = 31.25

pourquoi de tel erreur ?
j'utilise la dernier version de la jvm 1.4.2 sous windows XP

merci de votre aide

Gaetan



Avatar
TestMan
Le 1.5 introduit une timer à la nanoseconde :
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#nanoTime()

Mais comme le précise la doc, cela dépend encore de la precision de l'OS
;-)

De ce coté, on sait bien que l'ordonancement non-temps réel des threads
est l'un des problème de windows :(( Sur ce point la la majorité des
unix lui sont largement supérieur. Pour palier à ce problème les
developpeurs doivent faire preuve d'imagination ... ceux qui ont suivit
la saga Winamp depuis le debus comprendront de quoi je parle :D

TM

Gaetan Rey wrote:

Apres quelques tests sur les sleep (en java), j'ai remarqué un
comportement etrange.

la classe suivante fait une boucle qui attend x millisecondes
et incremente une valeur de 1... elle fait cela 5000 fois.

public class TestThread extends Thread {
int sleepTime;

public TestThread (int sleepTime) {
this.sleepTime = sleepTime;
this.start ();
}
public void run () {
int nbTest = 0;
int sleepTime = this.sleepTime;;
long begin = System.currentTimeMillis ();

while (nbTest < 5000) {
try {
sleep (sleepTime);
} catch (Exception e) {}
nbTest ++;
}
long time = System.currentTimeMillis ();
System.out.println ("average = "+((double)(time - begin)) /
(double)nbTest);
}

public static void main (String [] args) {

if (args.length == 1) {
System.out.println ("SleepTime = "+Integer.parseInt (args[0]));
new TestThread (Integer.parseInt (args[0]));
}
}
}

voila les resultats obtenues
SleepTime = 1
average = 1.9594

SleepTime = 5
average = 5.872

SleepTime = 30
average = 31.25

ce qui semble jusque la normal (de l'ordre de 1 ms d'ecart en moyenne)
regardons maintenant des sleep de 10 ou 20 ms
SleepTime = 10
average = 15.625
soit une erreur moyenne de 5 ms par sleep

SleepTime = 20
average = 31.25

pourquoi de tel erreur ?
j'utilise la dernier version de la jvm 1.4.2 sous windows XP

merci de votre aide

Gaetan