Les meilleures pratiques pour la réduction de l'activité du ramasse-miettes en Javascript

J'ai une assez complexe application Javascript, qui a une boucle principale qui est appelée à 60 fois par seconde. Il semble y avoir beaucoup de déchets de la collection en cours (basé sur les 'dents de scie' la sortie de la chronologie de la Mémoire dans le Chrome dev tools), et cela a souvent des répercussions sur les performances de l'application.

Donc, j'essaie de recherche sur les meilleures pratiques pour la réduction de la quantité de travail que le garbage collector a à faire. (La plupart des informations que j'ai pu trouver sur le web en ce qui concerne évitant les fuites de mémoire, qui est une question légèrement différente - mon espace mémoire est libérée, c'est juste qu'il y a trop de collecte des ordures se passe.) Je suis en supposant qu'il s'agit essentiellement vers le bas pour réutiliser les objets autant que possible, mais bien sûr, le diable est dans les détails.

L'application est structurée en "classes", le long de la lignes de John Resig est Simple JavaScript Héritage.

Je pense à un problème, c'est que certaines fonctions peuvent être appelées des milliers de fois par seconde (car ils sont utilisés des centaines de fois au cours de chaque itération de la boucle principale), et peut-être le travail local des variables dans ces fonctions (chaînes de caractères, tableaux, etc.) peut-être la question.

Je suis au courant de l'objet de mise en commun pour les plus grands ou plus lourds objets (et nous nous en servons pour un degré), mais je suis à la recherche pour les techniques qui peuvent être appliquées à travers le conseil d'administration, notamment en ce qui concerne les fonctions qui sont appelées à de très nombreuses reprises dans les boucles serrées.

Quels moyens puis-je utiliser pour réduire la quantité de travail que le collecteur doit faire?

Et, peut-être aussi - quelles techniques peuvent être employées pour identifier les objets qui sont en train d'être nettoyés le plus? (C'est un farly grande base de code, afin de comparer les clichés du tas n'a pas été très fructueuse)

  • Avez-vous un exemple de votre code que vous pourriez nous montrer? La question sera plus facile de répondre ensuite (mais aussi potentiellement moins général, donc je ne suis pas sûr ici)
  • Vous pouvez être en mesure d'utiliser et resuse variables à l'extérieur de son champ d'application, de sorte que vous n'avez pas les recréer à chaque fois. Par exemple: var x = "longstring"; dans votre boucle provoque des milliers de "longsting"s à être créé, mais dans un outerscope il ne fera que provoquer "longstring".
  • Comment arrêter l'exécution des fonctions des milliers de fois par seconde? Est-ce vraiment la seule façon d'aborder cette question? Cette question semble être un XY problème. Vous décrivez X, mais ce que vous êtes vraiment à la recherche d'une solution pour Y.
  • Il l'utilise seulement 60 fois par seconde, ce qui est tout à fait commun vitesse d'animation. Il n'a pas demander de faire moins de travail, mais comment le faire plus garbage-collection-efficace.
  • les fonctions peuvent être appelées des milliers de fois par seconde". C'est une fois par milliseconde (éventuellement le pire!). Qui n'est pas commun à tous. 60 fois par seconde ne devrait pas être un problème. Cette question est trop vague et ne va produire des opinions ou des suppositions.
  • Il n'y a pas de réponses utiles, mais cette question sonne un peu comme le double possible requestAnimationFrame garbage collection
  • merci, mais pour autant que je peux voir que la question est à propos de la requestAnimationFrame appelons la création de déchets (quand ce n'est pas vraiment de traitement de n'importe quoi).
  • Ce n'est pas du tout rare dans le jeu de cadres.

InformationsquelleAutor UpTheCreek | 2013-08-21