Ich habe eine ziemlich komplexe Javascript-App, die eine Hauptschleife hat, die 60 Mal pro Sekunde aufgerufen wird. Es scheint eine Menge Speicherbereinigung im Gange zu sein (basierend auf der Sägezahnausgabe von der Speicherzeitleiste in den Chrome-Entwicklungstools) - und dies wirkt sich häufig auf die Leistung der Anwendung aus.
Daher versuche ich, nach Best Practices zu suchen, um den Arbeitsaufwand für den Garbage Collector zu reduzieren. (Die meisten Informationen, die ich im Internet finden konnte, beziehen sich auf die Vermeidung von Speicherlecks. Dies ist eine etwas andere Frage. Mein Speicher wird freigegeben, es wird nur zu viel Speicherplatz gesammelt.) Ich gehe davon aus dass es hauptsächlich darauf ankommt, Objekte so oft wie möglich wiederzuverwenden, aber natürlich steckt der Teufel im Detail.
Die App ist in 'Klassen' nach dem Vorbild von John Resigs Simple JavaScript Inheritance strukturiert .
Ich denke, ein Problem ist, dass einige Funktionen tausende Male pro Sekunde aufgerufen werden können (da sie bei jeder Iteration der Hauptschleife hunderte Male verwendet werden), und möglicherweise die lokalen Arbeitsvariablen in diesen Funktionen (Strings, Arrays usw.). könnte das Problem sein.
Ich bin mir des Objekt-Poolings für größere / schwerere Objekte bewusst (und wir verwenden dies bis zu einem gewissen Grad), aber ich suche nach Techniken, die auf der ganzen Linie angewendet werden können, insbesondere in Bezug auf Funktionen, die in engen Schleifen sehr oft aufgerufen werden .
Mit welchen Techniken kann ich den Arbeitsaufwand für den Garbage Collector reduzieren?
Und vielleicht auch - mit welchen Techniken kann ermittelt werden, welche Objekte am häufigsten im Müll gesammelt werden? (Es ist eine sehr große Codebasis, daher war der Vergleich von Schnappschüssen des Heaps nicht sehr fruchtbar.)