Executando verificação de segurança...
1

[Dúvida] Lentidão na Main Thread JS: Amostragem JSSample Elevada

Estou enfrentando um problema de lentidão em minha aplicação JavaScript. Ao realizar um perfil de desempenho com as ferramentas de desenvolvedor do navegador, notei que a amostragem do JSSample está ocorrendo a cada 13ms, o que é significativamente mais lento do que o esperado 0,1ms. Essa lentidão parece tornar qualquer tarefa executada pelo JavaScript extremamente custosa. Já realizei um monitoramento da memória RAM, que parece estar normal, em torno de 300MB. A performance em web workers parece não ser afetada, sugerindo que o problema está isolado na Main thread da aba do navegador. Quais podem ser as possíveis causas para essa lentidão anormal na Main thread? Existem estratégias específicas ou ferramentas que eu poderia usar para diagnosticar e resolver esse problema?

Exemplo

Na imagem acima, as duas barras amarelas indicam os momentos em que o perfilamento de desempenho do Javascript coletou uma amostragem (JSSample). O intervalo foi de 13ms.
Isso indica um falso-positivo de que o getter shouldUseFractionQuote custou 13ms de execução... Mas, na verdade, a coleta de amostragem é que demorou para ocorrer. Repare que entre as linhas amarelas, não houve nenhum outro JSSample...

Carregando publicação patrocinada...
1

Não entendi bem.
O que você esta fazendo?
Ta usando lib (JSSample)?
O que ela faz?
É velha? Nova?

Você esta passando pouca informação!

1

Trabalho num projeto de plataforma de negociação de ativos. O performance profile da imagem é de um dos fluxos de atualização de resultados da posição a partir da cotação mais recente do ativo...

JSSample não é uma lib. É uma amostragem que o runtime do V8 coleta numa determinada frequência para montar a callstack que a gente vê no performance profile do Devtools. Você consegue ativar a visualização dela na aba experimental das configurações do Devtools, V8 Runtime Show Timeline. A flag experimental apenas habilita a visualização da mesma, juntamente de outros eventos da Thread principal com o motor V8, que por padrão não são exibidos, mas sempre existiram e estão ali, escondidinhos.

Essa frequência de amostragem é geralmente muito rápida (algo nos entornos de 0.1ms), mas para alguns usuários da minha plataforma, isso está estranhamente mais lento (chegando às vezes aos 16ms).

Veja bem, uma task é caracterizada longa (longtask) se tiver mais de 50ms de duração, o que daria pra tirar cerca de 500 JSSamples numa frequência normal, mas no estado em que se encontra, 4 JSSamples já caracteriza uma Longtask (52ms)...

Toda a execução da Main thread está lenta e custosa, incluindo o próprio perfilamento (JSSample), que deveria ser atomicamente a coisa mais rápida a ser executada.

Como resultado disso, o Gráfico de operação do cliente fica extremamente inoperável, lento, porque a Main está ocupada e, consequentemente, bloqueando a renderização e interação com a UI.

Isso ocorre apenas com alguns clientes, o que significa que nao é totalmente problema do algoritmo do gráfico... O hardware tende a ser padrão em nossa base de clientes, pois servimos uma aplicação exclusivamente MacOS, cuja configuração de hardware é idêntica para entre os mesmos modelos de equipamento.

1

Puxa vida, ainda não conhecia essa nova feature do v8/Devtools
Tentei pesquisar e não achei nada sobre JSSamples, só libs.
Deve ser algo muito novo!

Quanto ao seu problema, vc teria que destrinchar melhor seu sistema.
Separar para ir pegando canto por canto e ver onde esta a lentidão.

Como você disse o JSSamples é experimental. Pode dar problemas

1

É que experimental é apenas a visualização na timeline. Mas, o mecanismo de coleta de amostragem sempre foi assim mesmo...

Na real, acredito que nunca vai sair dessa flag experimental essa opção, pois ela é "avançada" e poucos são os cenários em que ela se faz necessária e, portanto, não faz sentido ser exibida sempre, por padrão...