4 votes

Combien de fois pouvez-vous faire compter += 1 en une seconde avec Javascript ?

J'essaie de mesurer combien de fois je peux faire "count = count + 1" en une seconde. Mais cette fonction ne fonctionne pas avec le navigateur. Je ne sais pas si quelqu'un peut m'expliquer pourquoi cela se produit ou si quelqu'un a une meilleure méthode pour le calculer.

function counter(){
   var count = 0;
   var trs = true;
   while(trs){
      count = count + 1;
      setTimeout(() => {trs = false;}, 1000);
   }
   console.log(count);
}

4voto

Armin Primadi Points 334

La raison pour laquelle il se bloque est une boucle infinie. JavaScript est piloté par les événements + un seul thread et dans le modèle d'exécution JavaScript, la fonction doit se terminer avant de céder le contrôle à une autre fonction. Ainsi, le code while (trs) {...} ne cède jamais le contrôle à la fonction définie dans setTimeout parce qu'elle ne se termine jamais. trs est toujours true .

Belle visualisation du fonctionnement du modèle d'exécution JavaScript : https://blog.avenuecode.com/understanding-the-javascript-concurrency-model

Voici une meilleure façon de procéder :

function counter() {
  var count = 0
  var start = Date.now()
  var end = start + 1000
  while (Date.now() <= end) {
    count = count + 1
  }
  console.log(count)
}

2voto

SomoKRoceS Points 2439

Il s'agit d'une boucle infinie. Or, comme le javascript est monotâche, le navigateur va se retrouver coincé dans cette boucle infinie, ce qui risque de remplir le cache très rapidement et de provoquer un plantage (ou de ne rien restituer).

Tout d'abord, d'une manière générale, il est préférable de créer le fichier setTimeout une seule fois, avant d'appeler while :

   var count = 0;
   var trs = true;
   setTimeout(() => {trs = false;}, 1000);
   while(trs){
      count = count + 1;
   }
   console.log(count);

Toutefois, cela entraînera également un plantage.

Vous pouvez essayer de mesurer les opérations différemment, en mesurant le temps nécessaire pour une seule opération. count = count + 1 opération à exécuter, puis déterminer combien d'entre elles peuvent être exécutées en une seconde (bien que ce ne soit pas la même chose que d'exécuter X opérations consécutives, pour lesquelles d'autres paramètres pourraient influencer le résultat, mais je suppose que vous vous souciez d'une seule opération ou d'une seule fonction que vous voulez mesurer).

   var count = 0;
   var t0 = performance.now()
   count = count + 1;
   var t1 = performance.now()
   console.log(1000/(t1 - t0));

Si vous voulez qu'il se trouve à l'intérieur d'une boucle, vous pouvez également inclure la vérification de la valeur (avec if), que la fonction while avant d'exécuter son bloc.

   var count = 0;
   var trs=true;
   var t0 = performance.now()
   if(trs==true){
      count = count + 1;
   }
   var t1 = performance.now()
   console.log(1000/(t1 - t0));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X