Est-ce que le CPU de setInterval est intensif?

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

ce que le code fait est de vérifier les changements de hachage dans L'URL (contenu après #) toutes les 100 millisecondes et si elle a changé, charger une page en utilisant AJAX. Si il n'a pas changé, il ne se passe rien. Y aurait-il des problèmes de CPU avec ça?

53
demandé sur Ryuku 2011-07-11 16:33:38

6 réponses

Je ne pense pas que setInterval va de façon inhérente vous causer des problèmes de performance importants. Je pense que la réputation peut venir d'une époque plus tôt, quand les CPU étaient moins puissants.

il y a des moyens d'améliorer la performance, cependant, et il est probablement sage de les faire:

  1. passer une fonction à setInterval , plutôt qu'une chaîne.
  2. ont aussi peu d'intervalles fixés que possible.
  3. rend les durées d'intervalle aussi longues que possible.
  4. ont le code courant à chaque fois aussi court et simple que possible.

n'optimisez pas prématurément-ne vous rendez pas la vie difficile quand il n'y a pas de problème.

une chose, cependant, que vous pouvez faire dans votre cas particulier est d'utiliser l'événement onhashchange , plutôt que des temps morts, dans les navigateurs qui le prennent en charge.

51
répondu lonesomeday 2011-07-11 12:43:12

je préférerais dire que c'est tout le contraire. En utilisant setTimeout et setInterval correctement, peut drastical réduire l'utilisation CPU des navigateurs. Par exemple, utiliser setTimeout au lieu d'utiliser une boucle for ou while ne réduira pas seulement l'intensité de L'utilisation CPU, mais garantira également que le navigateur a une chance de mettre à jour la file D'attente UI plus souvent. Ainsi, les processus en cours d'exécution ne vont pas geler et verrouiller l'expérience de l'utilisateur.

mais en général, utiliser setInterval vraiment comme 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 de nouveau.. vous pouvez vraiment tout gâcher je suppose que ce n'est pas un problème de setInterval .

..et au fait, tu n'as pas besoin de vérifier le hachage comme ça. Il y a des événements pour cela:

onhashchange

va tirer quand il y a eu un changement dans le hachage.

window.addEventListener('hashchange', function(e) {
    console.log('hash changed, yay!');
}, false);
14
répondu jAndy 2013-11-21 06:38:15

Non, setInterval n'est pas de CPU et de lui-même. Si vous avez beaucoup d'intervalles tournant sur des cycles très courts (ou une opération très complexe tournant sur un intervalle modérément long), alors que peut facilement devenir intensif CPU, selon exactement ce que vos intervalles font et à quelle fréquence ils le font.

Je ne m'attendais pas à voir des problèmes avec la vérification de L'URL toutes les 100 millisecondes sur un intervalle, bien que personnellement, je voudrais augmenter l'intervalle à 250 millisecondes, juste parce que je ne m'attends pas à ce que la différence entre les deux serait perceptible pour un utilisateur typique et parce que je tente généralement d'utiliser les plus longs intervalles de temps que je pense que je peux m'en tirer, en particulier pour les choses qui sont censés entraîner un no-op la plupart du temps.

9
répondu aroth 2011-07-11 12:40:08

il y a un peu de marketing en cours là-bas sous le terme" CPU intensive". Ce que cela signifie réellement est "plus intensif en CPU que certaines alternatives". Ce N'est pas" CPU intensive "comme dans"utilise beaucoup de puissance CPU comme un jeu ou un algorithme de compression ferait".

explication:

une fois que le navigateur a cédé le contrôle, il repose sur une interruption de le système d'exploitation sous-jacent et le matériel pour recevoir le contrôle et question le rappel JavaScript. Ayant des durées plus longues entre ces interrupts permet au matériel d'entrer des états de faible puissance qui diminue de manière significative la consommation d'énergie. Par défaut, le système D'exploitation Microsoft Windows et Intel basé les processeurs utilisent des résolutions de 15.6 ms pour ces interruptions (64 interruptions par seconde). Cela permet aux processeurs Intel d'entrer leurs plus bas l'état de l'alimentation. Pour cette raison, les développeurs web ont traditionnellement seulement j'ai pu obtenir 64 callbacks par seconde lors de l'utilisation de setTimeout(0) lors de l'utilisation de navigateurs HTML4, y compris les éditions précédentes d'Internet Explorer et Mozilla Firefox.

au Cours des deux dernières années, les navigateurs ont tenté d'accroître le nombre de callbacks par seconde que les développeurs JavaScript peuvent recevoir par les API setTimeout et setInterval en changeant la conscience de la puissance Les paramètres du système Windows et empêchant le matériel d'entrer bas les états d'alimentation. La spécification HTML5 est passée à la extrême de je recommande 250 callbacks par seconde. Cette haute fréquence peut résulter dans une augmentation de 40% de la consommation d'énergie, impactant la durée de vie de la batterie, les charges d'exploitation, et de l'environnement. En outre, cette approche n'aborde pas le problème de performance de base de l'amélioration de la CPU efficacité et ordonnancement.

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

4
répondu user703016 2011-07-11 12:40:42

dans votre cas, il n'y aura pas de problème. Mais si vous faites d'énormes animations dans canvas ou en travaillant avec webgl , il y aura des problèmes de CPU, donc pour cela vous pouvez utiliser requestAnimationFrame.

Consultez ce lien Sur requestAnimationFrame

3
répondu Sarath 2011-07-11 12:41:53
"151900920 de la Fonction" time > intervalle de temps est mauvais, vous ne pouvez pas savoir quand le cpu hoquet ou est lent et il empile sur le dessus de fonctions continues jusqu'à ce que le pc se fige. Utilisez settimeout ou encore mieux, process.nextick utilisant un callback à l'intérieur d'un settimeout.

1
répondu huseyin tugrul buyukisik 2016-11-25 16:10:16