fonction récursive vs setInterval vs javascript setTimeout
je suis à l'aide de NodeJs et de la nécessité d'appeler un infini de la fonction, mais je ne sais pas ce qui est le mieux pour une performance optimale.
fonction récursive
function test(){
//my code
test();
}
setInterval
setInterval(function(){
//my code
},60);
setTimeout
function test(){
//my code
setTimeout(test,60);
}
Je veux le meilleur rendement sans s'effondrer le serveur. Mon code ont plusieurs opérations arithmétiques.
apprécier toutes les suggestions pour optimiser les performances javascript.
- dépend de la fonction que vous appelez
Vous devez vous connecter pour publier un commentaire.
Être prudent.. votre premier code bloc JavaScript boucle d'événements.
Essentiellement dans le JS est quelque chose comme la liste de fonctions qui doivent être traitées. Lorsque vous appelez
setTimeout
,setInterval
ouprocess.nextTick
vous allez ajouter une fonction donnée à cette liste, et quand le bon moment viendra, il sera traité..Votre code dans le premier cas serait de ne jamais arrêter de sorte qu'il ne serait jamais laisser une autre des fonctions dans la liste des événements à traiter.
Deuxième et troisième cas est bon.. avec un peu de différence.
Si votre fonction prend pour exemple 10ms et l'intervalle sera la vôtre 60ms..
Donc, la différence est le délai entre les mises en chantier de votre fonction qui peut être important dans un certain intervalle de temps en fonction des systèmes, comme des jeux, des ventes aux enchères, marché boursier.. etc..
Bonne chance avec votre récursivité 🙂
Comme déjà mentionné, d'innombrables fonctions récursives conduire à un débordement de pile. Temps, a conduit à des rappels seront exécutés dans un contexte particulier, avec un clair de la pile.
setInterval
est utile pour les plus précis périodique appels récursifssetTimeout
, cependant, il ya un inconvénient: Le rappel sera déclenché même si une exception non interceptée a été jeté. Ce produit généralement un plusieurs octets d'entrée de journal tous les 60 millisecondes, 1'440'000 entrées par jour. En outre, unsetInterval
de rappel avec charge lourde pourrait finir par avoir un script ne répond pas ou même système trou.Récursive
setTimeout
immédiate avant le retour de fonction pas être exécuté si aucune exception n'a pas été pris. Il va garantir un laps de temps pour d'autres tâches après le retour de la fonction de rappel indépendante de la fonction du temps d'exécution.Pas sûr de ce que vous essayez d'accomplir, mais ici, c'est un "coffre-fort" façon d'utiliser la récursivité... https://stackoverflow.com/questions/24208676/how-to-use-recursion-in-javascript/24208677
En supposant que la "performance retard" décrit par Jan Juna, j'ai essayé ce script simple pour vérifier si il y a des différences en termes de débit:
Intervalle:
Délai d'attente:
Et c'est la sortie vith nodejs 8.11: qui ne montre pas de différence en termes de débit:
La fonction récursive provoquer un débordement de pile. Ce n'est pas ce que vous voulez.
La
setInterval
etsetTimeout
les moyens que vous avez indiqués sont identiques, sauf quesetInterval
est plus clair.Je le recommande
setInterval
. (Après tout, qu'est ce que c'est.)Récursive
setTimeout
garantit un délai entre les exécutions,setInterval
– ne.Nous allons comparer les deux fragments de code. La première utilise l'
setInterval
:Le second utilise récursive
setTimeout
:Pour
setInterval
le programmateur interne fonctionnerafunc(i)
toutes les 100ms.Le réel retard entre
func
appels poursetInterval
est moindre que dans le code!Qui est normal, parce que le temps pris par les
func's
exécution “consomme” une partie de l'intervalle.Il est possible que
func's
exécution s'avère plus long que prévu et prend plus de 100ms.Dans ce cas, le moteur s'attend
func
terminer, puis vérifie le planificateur et si le temps est écoulé, l'exécute à nouveau immédiatement.Dans le cas limite, si la fonction s'exécute toujours plus de
delay
ms, puis les appels ne se fera sans une pause.Le récursive
setTimeout
garantit le fixedelay
(ici 100ms).//utiliser la fonction setInterval
1000ms=1second;
la propriété style.largeur etc;
setInterval()
est "le meilleur pour ... une performance optimale" (comme la question demande), essayer d'expliquer les pourquoi elle est plus performante que les autres options. Profitez de votre temps sur le site!