Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pourquoi ce script ne marche t'il pas ?

19 réponses
Avatar
ast
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);

while (cond) {
i++;
}

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY>
</HTML>

10 réponses

1 2
Avatar
ast
"ast" a écrit dans le message de news:4d11f45c$0$17793$
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);
while (cond) {
i++;
}

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY> </HTML>




Le but de ce programme était de voir combien de fois la variable
i pouvait être incrémentée en 10 ms.
ça ne marche pas, le navigateur reste bloqué. Pourtant la fonction Stop_
arrête tout après 10 ms.
Avatar
NewsReader
On 12/22/2010 01:58 PM, ast wrote:

"ast" a écrit dans le message de
news:4d11f45c$0$17793$
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);
while (cond) {
i++;
}

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY> </HTML>




Le but de ce programme était de voir combien de fois la variable
i pouvait être incrémentée en 10 ms.
ça ne marche pas, le navigateur reste bloqué. Pourtant la fonction Stop_
arrête tout après 10 ms.



Ca ne marche pas parce que tu ne ressort jamais de la boucle while(cond)
{ i++; } puisque cond est toujours true.
Avatar
NewsReader
On 12/22/2010 03:08 PM, NewsReader wrote:
On 12/22/2010 01:58 PM, ast wrote:

"ast" a écrit dans le message de
news:4d11f45c$0$17793$
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);
while (cond) {
i++;
}

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY> </HTML>




Le but de ce programme était de voir combien de fois la variable
i pouvait être incrémentée en 10 ms.
ça ne marche pas, le navigateur reste bloqué. Pourtant la fonction Stop_
arrête tout après 10 ms.



Ca ne marche pas parce que tu ne ressort jamais de la boucle while(cond)
{ i++; } puisque cond est toujours true.


Une manière de faire:

var start = new Date();
var stop = false;
var i = 0;

while (stop === false) {
i++;
var elapsed = new Date() - start;
stop = (elapsed > 10) ? true:false;
}

document.formu.cadran.value = i;
Avatar
Pascal
Le 22/12/2010 13:58, ast a écrit :

Le but de ce programme était de voir combien de fois la variable
i pouvait être incrémentée en 10 ms.
ça ne marche pas, le navigateur reste bloqué. Pourtant la fonction Stop_
arrête tout après 10 ms.



Salut,

Ça me plait, ce truc, car en fait le résultat affiché dépend à la fois
de la puissance de l'unité de calcul et de l'efficacité du script, en
terme de cycles machine.

Tout d'abord, je précise que je ne remets pas en cause la réponse, fort
juste, de NewsReader.
Mais comme on approche des fêtes, et que je suis joueur par nature, je
propose de lancer un challenge sous forme de banc d'essai comparatif
(benchmark).

L'idée est donc de comparer, à puissance machine égale, l'efficacité de
scripts ayant les mêmes fonctionnalités, lancés en séquence dans la même
page web sur un temps de 1 seconde chacun.
Bien sûr, il fallait un script qui serve de base au calcul relatif du
score, et c'est tout naturellement que j'ai choisi celui proposé par
NewsReader (j'espère qu'il ne m'en voudra pas, c'est seulement pour le
sport).

Ci-dessous le lien du fichier HTML complet, dans lequel on trouve :
- le formulaire à compléter pour chaque script supplémentaire à tester;
- le script général, comprenant :
- une variable globale "benchmark" contenant le formulaire;
- une fonction "setRatio()" qui calcule et affiche le score pour le
comptage courant, passé en argument;
- autant de portions successives de script qu'il y en a à tester.

J'ai déjà positionné le script proposé par NewsReader, suivi de celui
correspondant à ma première proposition, pour lequel j'obtiens un ratio
moyen de 160.

A vous de jouer, si le coeur vous en dit, et joyeux Noël !
http://fr.sourcepod.com/dhiloc87-4050


--
Cordialement,
Pascal
Avatar
ast
"NewsReader" a écrit dans le message de
news:4d120678$0$27725$
On 12/22/2010 01:58 PM, ast wrote:

"ast" a écrit dans le message de
news:4d11f45c$0$17793$
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);
while (cond) {
i++;
}

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY> </HTML>




Le but de ce programme était de voir combien de fois la variable
i pouvait être incrémentée en 10 ms.
ça ne marche pas, le navigateur reste bloqué. Pourtant la fonction Stop_
arrête tout après 10 ms.



Ca ne marche pas parce que tu ne ressort jamais de la boucle while(cond) { i++; } puisque cond est
toujours true.



Ben à 10 ms, il y a la fonction Stop_ qui devrait se déclencher
Avatar
ast
"NewsReader" a écrit dans le message de
news:4d1209cd$0$19144$
On 12/22/2010 03:08 PM, NewsReader wrote:
On 12/22/2010 01:58 PM, ast wrote:

"ast" a écrit dans le message de
news:4d11f45c$0$17793$
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);
while (cond) {
i++;
}

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY> </HTML>




Le but de ce programme était de voir combien de fois la variable
i pouvait être incrémentée en 10 ms.
ça ne marche pas, le navigateur reste bloqué. Pourtant la fonction Stop_
arrête tout après 10 ms.



Ca ne marche pas parce que tu ne ressort jamais de la boucle while(cond)
{ i++; } puisque cond est toujours true.


Une manière de faire:

var start = new Date();
var stop = false;
var i = 0;

while (stop === false) {
i++;
var elapsed = new Date() - start;
stop = (elapsed > 10) ? true:false;
}

document.formu.cadran.value = i;





oui, ça marche bien, merci
Avatar
NewsReader
On 12/22/2010 07:53 PM, ast wrote:

"NewsReader" a écrit dans le message de
news:4d120678$0$27725$
On 12/22/2010 01:58 PM, ast wrote:

"ast" a écrit dans le message de
news:4d11f45c$0$17793$
<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

id = setTimeout("Stop_();",10);
while (cond) {
i++;
}

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY> </HTML>




Le but de ce programme était de voir combien de fois la variable
i pouvait être incrémentée en 10 ms.
ça ne marche pas, le navigateur reste bloqué. Pourtant la fonction Stop_
arrête tout après 10 ms.



Ca ne marche pas parce que tu ne ressort jamais de la boucle
while(cond) { i++; } puisque cond est toujours true.



Ben à 10 ms, il y a la fonction Stop_ qui devrait se déclencher



Je crois que cette logique serait valable dans d'autres langages comme
Java par exemple.

Malheureusement, elle n'est pas valable pour javascript: ne pas oublier
le "script" dans javascript ...
Avatar
Mickaël Wolff
On 22/12/10 14:23, NewsReader wrote:

Ca ne marche pas parce que tu ne ressort jamais de la boucle while(cond)
{ i++; } puisque cond est toujours true.





La question est donc plutôt : pourquoi la valeur de la variable cond
n'est pas mise à jour.

Une manière de faire:

var start = new Date();
var stop = false;
var i = 0;

while (stop === false) {
i++;
var elapsed = new Date() - start;
stop = (elapsed > 10) ? true:false;



Si l'OP utilisait un timer, c'est certainement pour mesurer combien
d'itération peuvent être faites dans un délais donné. Avec ta méthode,
le résultat est simplement faux puisqu'il comprend des instanciations,
et tout un tas d'opérations qui prennent du temps.

Ceci dit, en règle générale, pour mesurer combien d'opérations
peuvent être effectuées durant un laps de temps, on préférera effectuer
l'opération un certains nombre de fois et de mesurer le temps qu'on
prises les exécutions.

var start = Date()
var n = 10000
var i = n
do i++ while(i < n)
var end = Date()

var delta = end - start
var op_per_sec = n / delta.milliseconds / 1000

Mais avec tout ça nous avons toujours un problème sur les bras :
pourquoi la boucle while continue alors que la variable cond est mise à
false. Car si on ajoute un callback qui se déclenche plus tard pour lire
la valeur, on se rend compte que cond est bien à false.
Moi ça m'intéresse de savoir d'où vient ce fonctionnement (et dire
que c'est parce que c'est un langage de script montre une bien faible
connaissance du sujet).
J'ai fait plusieurs essais. Et il semblerait que ce ne soit pas le
mécanisme de closure qui part en couille. Car même si je pose cond sur
l'objet global, la boucle while ne voit pas sa mise à jour.
Avatar
Newsreader
On 12/22/2010 10:20 PM, Mickaël Wolff wrote:
On 22/12/10 14:23, NewsReader wrote:

Ca ne marche pas parce que tu ne ressort jamais de la boucle while(cond)
{ i++; } puisque cond est toujours true.





La question est donc plutôt : pourquoi la valeur de la variable cond
n'est pas mise à jour.

Une manière de faire:

var start = new Date();
var stop = false;
var i = 0;

while (stop === false) {
i++;
var elapsed = new Date() - start;
stop = (elapsed > 10) ? true:false;



Si l'OP utilisait un timer, c'est certainement pour mesurer combien
d'itération peuvent être faites dans un délais donné. Avec ta méthode,
le résultat est simplement faux puisqu'il comprend des instanciations,
et tout un tas d'opérations qui prennent du temps.

Ceci dit, en règle générale, pour mesurer combien d'opérations peuvent
être effectuées durant un laps de temps, on préférera effectuer
l'opération un certains nombre de fois et de mesurer le temps qu'on
prises les exécutions.

var start = Date()
var n = 10000
var i = n
do i++ while(i < n)
var end = Date()

var delta = end - start
var op_per_sec = n / delta.milliseconds / 1000

Mais avec tout ça nous avons toujours un problème sur les bras :
pourquoi la boucle while continue alors que la variable cond est mise à
false. Car si on ajoute un callback qui se déclenche plus tard pour lire
la valeur, on se rend compte que cond est bien à false.
Moi ça m'intéresse de savoir d'où vient ce fonctionnement (et dire que
c'est parce que c'est un langage de script montre une bien faible
connaissance du sujet).
J'ai fait plusieurs essais. Et il semblerait que ce ne soit pas le
mécanisme de closure qui part en couille. Car même si je pose cond sur
l'objet global, la boucle while ne voit pas sa mise à jour.



Mickael,quelques remarques:

- OK avec toi pour dire que la méthode que je propose n'est pas valable
pour un test de performance exactement pour les raisons que tu évoques
(opérations 'connexes' au sein de la boucle); c'était juste pour donner
un exemple "quick and dirty" de la fonctionalité.

- La raison pour laquelle cond n'est jamais mise à false : pour le
comprendre, il faudrait déjà commencer par comprendre la nature de
javascript ...

Contrairement à d'autres langages qui sont "multi-tâches", javascript
est un langage interprété "mono-tâche" (single-threaded). Pour faire
simple, l'interpreteur n'execute qu'une seule instructtion à la fois et
de manière séquentielle au cours d'une "boucle d'évènements" (event
loop). Les actions "asynchrones" comme les callback et les timers sont
aussi exécutées de manière séquentielle, c'est à dire lorsque
l'instruction précédente est terminée.

Dans le cas qui nous intéresse, le timer est bien enregistré mais n'est
jamais exécuté puisque la boucle d'exécution (event loop) ne sort jamais
de la boucle while.

Voilà ce que, avec ma très faible connaissance du sujet, je voulais dire
en faisant allusion au "script" de javascript. Mais je n'apprend sans
doute rien à un expert comme toi.
Avatar
Newsreader
On 12/22/2010 10:51 PM, Newsreader wrote:
On 12/22/2010 10:20 PM, Mickaël Wolff wrote:
On 22/12/10 14:23, NewsReader wrote:

Ca ne marche pas parce que tu ne ressort jamais de la boucle
while(cond)
{ i++; } puisque cond est toujours true.





La question est donc plutôt : pourquoi la valeur de la variable cond
n'est pas mise à jour.

Une manière de faire:

var start = new Date();
var stop = false;
var i = 0;

while (stop === false) {
i++;
var elapsed = new Date() - start;
stop = (elapsed > 10) ? true:false;



Si l'OP utilisait un timer, c'est certainement pour mesurer combien
d'itération peuvent être faites dans un délais donné. Avec ta méthode,
le résultat est simplement faux puisqu'il comprend des instanciations,
et tout un tas d'opérations qui prennent du temps.

Ceci dit, en règle générale, pour mesurer combien d'opérations peuvent
être effectuées durant un laps de temps, on préférera effectuer
l'opération un certains nombre de fois et de mesurer le temps qu'on
prises les exécutions.

var start = Date()
var n = 10000
var i = n
do i++ while(i < n)
var end = Date()

var delta = end - start
var op_per_sec = n / delta.milliseconds / 1000

Mais avec tout ça nous avons toujours un problème sur les bras :
pourquoi la boucle while continue alors que la variable cond est mise à
false. Car si on ajoute un callback qui se déclenche plus tard pour lire
la valeur, on se rend compte que cond est bien à false.
Moi ça m'intéresse de savoir d'où vient ce fonctionnement (et dire que
c'est parce que c'est un langage de script montre une bien faible
connaissance du sujet).
J'ai fait plusieurs essais. Et il semblerait que ce ne soit pas le
mécanisme de closure qui part en couille. Car même si je pose cond sur
l'objet global, la boucle while ne voit pas sa mise à jour.



Mickael,quelques remarques:

- OK avec toi pour dire que la méthode que je propose n'est pas valable
pour un test de performance exactement pour les raisons que tu évoques
(opérations 'connexes' au sein de la boucle); c'était juste pour donner
un exemple "quick and dirty" de la fonctionalité.

- La raison pour laquelle cond n'est jamais mise à false : pour le
comprendre, il faudrait déjà commencer par comprendre la nature de
javascript ...

Contrairement à d'autres langages qui sont "multi-tâches", javascript
est un langage interprété "mono-tâche" (single-threaded). Pour faire
simple, l'interpreteur n'execute qu'une seule instructtion à la fois et
de manière séquentielle au cours d'une "boucle d'évènements" (event
loop). Les actions "asynchrones" comme les callback et les timers sont
aussi exécutées de manière séquentielle, c'est à dire lorsque
l'instruction précédente est terminée.

Dans le cas qui nous intéresse, le timer est bien enregistré mais n'est
jamais exécuté puisque la boucle d'exécution (event loop) ne sort jamais
de la boucle while.

Voilà ce que, avec ma très faible connaissance du sujet, je voulais dire
en faisant allusion au "script" de javascript. Mais je n'apprend sans
doute rien à un expert comme toi.



Au cas où tu aurais toujours des difficultés à comprendre, je t'invite à
réfléchir sur pourquoi le deuxième alert n'est pas exécuté :

<HTML>
<BODY>

<FORM NAME="formu">
<INPUT NAME="cadran" TYPE="text" SIZE="32" VALUE="0" READONLY>
</FORM>

<SCRIPT LANGUAGE="JavaScript">

var cond = true;
var i = 0;
var id = null;
var texte = "";

alert('Hello');

id = setTimeout("Stop_();",10);

while (cond) {
i++;
}

alert('World');

function Stop_() {
cond = false;
texte = texte + i;
document.formu.cadran.value = texte;
}


</SCRIPT>
</BODY> </HTML>
1 2