Préface: j'ai un Démo du problème sur mon site personnel (j'espère que cela est ok. Sinon, je peux essayer de le mettre sur jsfiddle). Je souhaite que cette question soit un peu amusante, tout en essayant de comprendre les fonctions de temps, prenez JavaScript.
Je incrémente la valeur des barres de progression sur un délai d'attente. Idéalement (si les fonctions sont exécutées instantanément), elles devraient remplir à la même vitesse, mais dans le monde réel, ils ne le font pas. Le code est le suivant: p> naïfique, on pourrait penser que tous sont exécutés (remplir la barre de progression) à la même vitesse. p> Toutefois, dans les deux premières barres, (si nous appelons "définir la barre de progression" une seule opération), j'effectue une opération toutes les 500 ms pour un total de 500 opérations pour remplir la barre; Dans la troisième, j'effectue une opération toutes les 50 ms pour un total de 5 000 opérations pour remplir la barre; Dans le quatrième, j'effectue une opération toutes les 5 ms pour un total de 50 000 opérations pour remplir la barre. P> Quelle partie de mon code prend le plus long, provoque ces différences de vitesse et pourrait être modifiée dans afin de les faire sembler de fonctionner dans la manière dont ils le font (la quatrième bar devient des incréments plus petits), mais courez également à la même vitesse? P> P>
3 Réponses :
Le plus gros problème avec l'utilisation de Un autre facteur est qu'une fois vos feux de timeout, si un autre morceau de code est déjà exécuté, il devra attendre que cela finisse, retarder l'exécution. P>
Ceci est très similaire aux problèmes que les gens ont pour essayer d'utiliser Settimeout code> Pour des choses comme ceci est que votre exécution de code se produit entre les délais d'attente et n'est pas comptabilisé dans la valeur envoyée à
Settimeout code>. Si votre retard est de 5 ms et votre code prend 5 ms pour exécuter, vous doublez essentiellement votre temps. P>
Settimeout code> pour une horloge ou une chronomètre. La solution consiste à comparer l'heure actuelle avec le temps que le programme a démarré et calculer le temps en fonction de cela. Vous pourriez faire quelque chose de similaire. Vérifiez combien de temps cela a été depuis que vous avez commencé et définissez le% basé sur cela. P>
Ahh de sorte que la barre semblerait incrémenter à un tarif régulier, depuis le début de son commencement, mais c'est un calcul nouveau à chaque fois, cela compenserait donc le temps perdu sur les retards et les opérations en file d'attente?
Fondamentalement. Vous pourriez être légèrement hors de synchronisation pendant de très courtes morceaux, mais allait toujours revenir à la prochaine fois un délai d'attente.
Je me rends compte que c'est une sorte de chose d'expérimentation, mais si c'était une situation réelle, vous voudriez probablement simplement une minuterie et que vous mettriez à jour les 4 de la même exécution. Ensuite, vous seriez toujours en synchronisation.
Qu'est-ce qui cause la différence de vitesse deux choses: tout d'abord, c'est le fait que vous exécutez plus de code pour remplir la barre inférieure (lorsque vous faites allusion au 2ème au dernier paragraphe). En outre, chaque fois que vous définissez un délai d'attente, votre navigateur la file de ... Le délai réel peut être plus long que ce que vous spécifiez, en fonction de la quantité de file d'attente (voir MDN sur fenêtre.Settimeout ). P>
Aimez la question, je n'ai pas de réponse très précise, mais voici mes 2 cents: p>
JavaScript est un langage très rapide qui traite très bien avec sa boucle d'événement et qu'il mange donc des tétitouts et designervals pour le petit-déjeuner.
Il existe cependant des limites et ils dépendent d'un grand nombre de facteurs, tels que le navigateur et la vitesse informatique, la quantité de fonctions que vous avez sur la boucle d'événement, la complexité du code pour exécuter et les valeurs de délai d'expiration ... P>
Dans ce cas, je pense qu'il est évident que si vous essayez d'exécuter une fonction toutes les 500 ms, il va se comporter beaucoup mieux que d'exécuter toutes les 50 ms, donc beaucoup mieux que chaque 5 ms. Si vous prenez en compte que vous les exécutez tous les uns sur les autres, vous pouvez prédire que la performance ne sera pas optimale. P>
Vous pouvez essayer cet exercice:
Prenez le 500MS ONE, et passez-le seul. Marquez le temps total qu'il a fallu pour remplir la barre (ici, vous verrez qu'il va prendre un peu plus longtemps que prévu).
Essayez d'exécuter deux fois plus de temps d'attente de 500 ms en même temps et voyez que le temps total est devenu un peu plus long.
Si vous y ajoutez la 50 ms, puis le 5 ms, vous verrez que vous perdrez la performance à chaque fois ... P>
Si je regarde ce droit, vos étiquettes sont éteintes sur l'exemple du site. N'est-ce pas la 4ème barre .01 tous les 5 ms?
@Jamesmontagne whoops. Merci. Fixé.
Notez que le retard d'un
settimeout code> peut être serré à une valeur minimale; 4MS pour les navigateurs HTML5 (et chrome) mais cela dépend du navigateur. C'est-à-dire que cela peut la fixer à une valeur plus grande comme 10 ms.