J'ai une application Javascript assez complexe, qui a une boucle principale appelée 60 fois par seconde. Il semble y avoir beaucoup de ramasse-miettes en cours (basé sur la sortie `` en dents de scie '' de la chronologie de la mémoire dans les outils de développement Chrome) - et cela a souvent un impact sur les performances de l'application.
J'essaie donc de rechercher les meilleures pratiques pour réduire la quantité de travail que le garbage collector doit effectuer. (La plupart des informations que j'ai pu trouver sur le Web concernent éviter les fuites de mémoire, ce qui est une question légèrement différente - ma mémoire se libère, c'est juste qu'il y a trop de ramasse-miettes en cours.) Je suppose que cela revient principalement à réutiliser des objets autant que possible, mais bien sûr, le diable est dans les détails.
L'application est structurée en «classes» sur le modèle de l'héritage JavaScript simple de John Resig .
Je pense qu'un problème est que certaines fonctions peuvent être appelées des milliers de fois par seconde (car elles sont utilisées des centaines de fois à chaque itération de la boucle principale), et peut-être les variables de travail locales dans ces fonctions (chaînes, tableaux, etc.) pourrait être le problème.
Je suis conscient de la mise en commun d'objets pour des objets plus gros / plus lourds (et nous l'utilisons dans une certaine mesure), mais je recherche des techniques qui peuvent être appliquées à tous les niveaux, en particulier en ce qui concerne les fonctions qui sont appelées très souvent dans des boucles serrées. .
Quelles techniques puis-je utiliser pour réduire la quantité de travail que le garbage collector doit effectuer?
Et peut-être aussi - quelles techniques peuvent être employées pour identifier les objets qui sont le plus ramassés? (C'est une base de code très volumineuse, donc comparer des instantanés du tas n'a pas été très fructueux)