Eu tenho um aplicativo Javascript bastante complexo, que tem um loop principal que é chamado 60 vezes por segundo. Parece haver muita coleta de lixo acontecendo (com base na saída 'dente de serra' da linha do tempo do Memory nas ferramentas de desenvolvimento do Chrome) - e isso geralmente afeta o desempenho do aplicativo.
Portanto, estou tentando pesquisar as melhores práticas para reduzir a quantidade de trabalho que o coletor de lixo tem que fazer. (A maioria das informações que consegui encontrar na web diz respeito a evitar vazamentos de memória, o que é uma questão um pouco diferente - minha memória está sendo liberada, só que há muita coleta de lixo em andamento.) Estou assumindo que isso se resume principalmente em reutilizar objetos tanto quanto possível, mas é claro que o diabo está nos detalhes.
O aplicativo é estruturado em 'classes' ao longo das linhas de Herança JavaScript simples de John Resig .
Acho que um problema é que algumas funções podem ser chamadas milhares de vezes por segundo (visto que são usadas centenas de vezes durante cada iteração do loop principal) e talvez as variáveis de trabalho locais nessas funções (strings, arrays, etc.) pode ser o problema.
Estou ciente do agrupamento de objetos para objetos maiores / mais pesados (e usamos isso até certo ponto), mas estou procurando técnicas que podem ser aplicadas em todos os setores, especialmente relacionadas a funções que são chamadas muitas vezes em loops estreitos .
Que técnicas posso usar para reduzir a quantidade de trabalho que o coletor de lixo deve fazer?
E, talvez também - que técnicas podem ser empregadas para identificar quais objetos estão sendo mais coletados? (É uma base de código muito grande, portanto, comparar os instantâneos do heap não foi muito proveitoso)