60 votes

SetInterval est-il consommateur d'UC?

J'ai lu quelque part que setInterval est gourmand en CPU. J'ai créé un script qui utilise setInterval et surveillé l'utilisation du processeur, mais je n'ai pas remarqué de changement. Je veux savoir s'il y a quelque chose qui m'a manqué.

Le code vérifie les modifications du hachage dans l'URL (contenu après #) toutes les 100 millisecondes et s'il a changé, chargez une page à l'aide d'AJAX. S'il n'a pas changé, rien ne se passe. Y aurait-il des problèmes de processeur avec cela.

59voto

lonesomeday Points 95456

Je ne pense pas qu' setInterval est intrinsèquement va vous causer de sérieux problèmes de performance. Je soupçonne que la réputation peut venir d'une époque antérieure, lorsque les Processeurs sont moins puissants.

Il ya des façons que vous pouvez améliorer les performances, cependant, et il est probablement sage de le faire:

  1. Passer d'une fonction à l' setInterval, plutôt qu'une chaîne de caractères.
  2. Le nombre des intervalles fixés que possible.
  3. Faire l'intervalle des durées aussi longues que possible.
  4. Le code de l'exécution de chaque temps aussi court et simple que possible.

Ne pas optimiser prématurément, ne pas rendre la vie difficile pour vous quand il n'est pas un problème.

Une chose, cependant, que vous pouvez faire dans votre cas particulier est d'utiliser l' onhashchange événement, plutôt que les délais d'attente, dans les navigateurs qui le supportent.

14voto

jAndy Points 93076

Je dirais plutôt que c'est tout le contraire. À l'aide de setTimeout et setInterval correctement, peut drastical réduire les navigateurs d'utilisation du PROCESSEUR. Par exemple, à l'aide de setTimeout au lieu d'utiliser un for ou while la boucle ne sera pas seulement de réduire l'intensité de l'utilisation du PROCESSEUR, mais aussi de garantir que le navigateur a une chance de mettre à jour l'INTERFACE utilisateur de la file d'attente le plus souvent. Tant les processus en cours ne seront pas de gel et de blocage de l'expérience utilisateur.

Mais en général, l'utilisation de setInterval aime vraiment beaucoup sur votre site peut ralentir les choses. 20 en exécutant simultanément des intervalles plus ou moins lourd sur le spectacle. Et puis encore une fois.. vous ne pouvez vraiment gâcher une partie je suppose que ce n'est pas un problème d' setInterval.

..et en passant, vous n'avez pas besoin de vérifier le hash comme ça. Il y a des événements pour que:

onhashchange

le feu quand il y a un changement dans la table de hachage.

window.addEventListener('hashchange', function(e) {
    console.log('hash changed, yay!');
}, false);

9voto

aroth Points 28424

Non, setInterval n'est pas CPU intensive dans et de lui-même. Si vous avez beaucoup d'intervalles de course sur de très courtes cycles (ou une opération très complexe en cours d'exécution sur un assez long intervalle), puis qui peut facilement devenir l'UC, selon exactement ce que votre intervalles sont en train de faire et à quelle fréquence ils le font.

Je ne m'attends pas à voir des problèmes avec la vérification de l'URL de toutes les 100 millisecondes sur un intervalle, bien que personnellement je serait d'augmenter l'intervalle de 250 millisecondes, juste parce que je n'ai pas s'attendre à ce que la différence entre les deux serait perceptible par un utilisateur typique et parce que généralement, j'essaie d'utiliser le plus long délai d'attente des intervalles que je pense que je peux m'en tirer, en particulier pour des choses qui sont attendues dans un no-op, la plupart du temps.

4voto

Cicada Points 19550

Il y a un peu de marketing d'y aller dans le cadre du "UC" terme. Ce que cela signifie vraiment, c'est "plus de CPU que certaines solutions de rechange". Ce n'est pas "UC", comme dans "utilise un ensemble de beaucoup de puissance CPU comme un jeu ou un algorithme de compression allait faire".

Explication :

Une fois que le navigateur a donné le contrôle s'appuie sur une interruption de le système d'exploitation et le matériel, afin de recevoir de contrôle et de problème JavaScript de rappel. Ayant de plus longues durées entre ces les interruptions permet au matériel d'entrée de faible puissance des états qui diminue de manière significative la consommation d'énergie. Par défaut, le système d'exploitation Microsoft Windows et Intel processeurs utilisent un 15.6 ms résolutions de ces interruptions (64 interruptions par seconde). Cela permet à Intel sur les processeurs pour entrer à leur plus bas l'état de l'alimentation. Pour cette raison, les développeurs web ont traditionnellement seulement été en mesure d'atteindre 64 rappels par seconde lors de l'utilisation de setTimeout(0) lors de l'utilisation de HTML4 des navigateurs, y compris dans les éditions antérieures de l'Internet Explorer et Mozilla Firefox.

Au cours des deux dernières années, les navigateurs ont tenté d'accroître le nombre des rappels par seconde que les développeurs JavaScript peut recevoir par le biais de le setTimeout et setInterval de l'API par la modification de la puissance consciente Paramètres système de Windows et de la prévention de matériel de saisie de faible les états d'alimentation. La spécification HTML5 est allé à l'extrême de la recommander 250 rappels par seconde. Cette fréquence élevée peut entraîner dans une augmentation de 40% de la consommation d'énergie, impact sur la vie de la batterie, les charges d'exploitation, et de l'environnement. En outre, cette approche ne pas aborder le cœur du problème de performances de l'amélioration de la CPU de l'efficacité et de la programmation.

À partir de http://ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html

3voto

Sarath Points 3216

Dans votre cas, il n'y aura aucun problème. Mais si vous faites d'énormes animations dans le canevas ou travaillez avec webgl, il y aura des problèmes de processeur, donc pour cela, vous pouvez utiliser requestAnimationFrame.

Se référer à ce lien À propos de requestAnimationFrame

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