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 ();
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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:
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
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.
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:
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
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.
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.
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.
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.
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.
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.
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 ();
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
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 ();
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
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 ();
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
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 ();
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
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 ();
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
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 ();
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