Se você chegou aqui, provavelmente já sabe o que é latência e quer agir. Este texto não vai gastar seu tempo definindo o conceito de novo. É um guia prático para quem precisa deixar uma aplicação web mais rápida e quer fazê-lo na ordem certa, sem queimar semanas em otimizações que não movem o ponteiro.
A regra que organiza tudo o que vem a seguir é uma só: ataque o maior gargalo primeiro. Latência se concentra. Numa aplicação típica, uma ou duas etapas respondem pela maior parte da espera. Encontrá-las e resolvê-las vale mais do que dezenas de pequenos ajustes espalhados.
Vamos do trecho que costuma doer mais para o que costuma doer menos. Adapte a ordem à sua realidade, mas só depois de medir.
Comece medindo, sempre
Pular esta etapa é o erro que custa mais caro. Sem medição, você está otimizando no escuro, e a chance de mexer no lugar errado é alta.
Antes de tocar em qualquer código, instrumente a requisição. Você precisa saber quanto tempo é gasto no servidor, quanto na consulta a dados, quanto na rede e quanto na renderização do navegador. Ferramentas de observabilidade no backend e as ferramentas de desenvolvedor do navegador já dão um retrato suficiente para começar.
Olhe também a distribuição, não só a média. A latência dos piores casos, os usuários no percentil ruim, é o que gera reclamação e abandono. Uma média de tempo aceitável pode esconder uma cauda longa de gente sofrendo. Otimize pensando nessa cauda.
O banco de dados costuma ser o vilão
Na maioria das aplicações que ficam lentas com o tempo, o gargalo está nas consultas. Vale começar por aqui.
O suspeito clássico é a consulta sem índice adequado. Conforme a tabela cresce, uma busca que era instantânea com mil registros vira um arrasto com milhões. Identificar consultas lentas e adicionar os índices certos costuma ser a otimização de maior retorno que existe.
O segundo suspeito é o padrão de muitas consultas em sequência: a aplicação busca uma lista e, para cada item, dispara uma nova consulta. Dez itens viram onze idas ao banco; cem itens viram cento e uma. Resolver isso buscando os dados de uma vez transforma uma página lenta em uma página rápida sem mudar mais nada.
O terceiro é a consulta que traz dados demais. Pedir todas as colunas quando você usa três, ou trazer milhares de linhas para mostrar vinte, desperdiça tempo em todas as camadas. Peça só o que vai usar.
Cache: o atalho mais poderoso e o mais perigoso
Cache é a ferramenta que mais reduz latência e a que mais introduz bugs sutis. Use com intenção.
A ideia é simples: guardar o resultado de uma operação cara para não repeti-la. Dados que mudam pouco e são lidos muito, um catálogo, uma configuração, uma página pública, são candidatos perfeitos. Servir do cache elimina a consulta ao banco e a maior parte do processamento.
O perigo mora na invalidação: garantir que o cache seja atualizado quando o dado muda. Cache que serve informação velha gera problemas difíceis de diagnosticar, porque o sistema "funciona", só está errado. Antes de adicionar cache, decida como ele será invalidado. Se você não sabe responder isso, ainda não está pronto para cachear aquilo.
Cache em camadas
Há mais de um lugar para cachear, e eles se somam. No navegador, recursos estáticos podem ser guardados para não baixar de novo. Numa CDN, conteúdo pode ser servido de um ponto fisicamente perto do usuário. No servidor, resultados de operações caras podem ficar em memória. Cada camada corta um pedaço da latência total.
Encurte a distância e reaproveite conexões
Parte da latência é pura física: a distância entre o usuário e o servidor. Não dá para vencer a velocidade da luz, mas dá para encurtar o caminho.
Uma CDN coloca cópias do seu conteúdo perto de quem acessa. Para um público brasileiro, servir a partir de pontos de presença no país, em vez de um servidor distante, corta um tempo de viagem que nenhuma otimização de código recuperaria. Para conteúdo estático e mídia, é uma das melhores relações entre esforço e ganho.
Reaproveitar conexões também economiza. Abrir uma conexão segura nova custa idas e voltas pela rede; manter conexões vivas e usar protocolos modernos reduz esse custo repetido. É um ganho que aparece especialmente em páginas que fazem muitas requisições.
Aliviar o navegador
Mesmo com o servidor rápido, a tela só aparece depois que o navegador processa a resposta. Esse último trecho merece atenção.
Os ofensores comuns são conhecidos. JavaScript em excesso que trava o carregamento da página. Imagens grandes servidas sem compressão ou no tamanho errado. Recursos que bloqueiam a exibição enquanto carregam. Reduzir e adiar o que não é essencial para a primeira tela faz a aplicação parecer rápida mesmo quando ainda está terminando de carregar o resto.
A percepção importa tanto quanto o número. Mostrar conteúdo útil cedo, ainda que parcial, faz o usuário sentir velocidade. Uma tela em branco por dois segundos é pior do que uma tela que mostra estrutura imediatamente e completa em seguida.
Vale aplicar a mesma lógica de proporção também aqui. Antes de reescrever um componente inteiro em nome da performance, confirme que o trecho que você vai atacar é mesmo o que pesa na primeira tela. Muitas vezes o ganho maior vem de adiar o carregamento de algo secundário, não de reescrever o principal.
O erro de otimizar o que não dói
Vale o alerta que fecha qualquer guia honesto de performance: não otimize o invisível. É fácil se apaixonar por um trecho elegante de código e gastar dias economizando milissegundos que ninguém percebe, enquanto o gargalo real continua intacto.
Volte sempre à medição. Depois de cada otimização, meça de novo e confirme que o número que o usuário sente realmente melhorou. Se não melhorou, você otimizou a coisa errada. Performance é um jogo de proporção, e a humildade de medir é o que evita o desperdício.
Fechamento
Reduzir latência não é mágica nem heroísmo técnico. É método: medir, achar o maior gargalo, resolver, medir de novo. Banco de dados, cache, distância e navegador são os lugares onde o tempo mais se perde, e quase sempre um deles concentra o problema.
Velocidade é uma decisão de produto disfarçada de tarefa de engenharia. Times que a tratam com método entregam aplicações que respeitam o tempo de quem usa, e gastam menos energia apagando incêndios de performance depois.
Se você está nesse trabalho agora, comece pela medição antes de qualquer outra coisa. Há outros artigos aqui no blog sobre arquitetura, cache e escalabilidade que aprofundam cada um desses pontos.
Leia também
- Latência em aplicações web: os fundamentos que todo time precisa entender
- Cache em aplicações: guia rápido de boas práticas (e dos erros que ele esconde)
- Consumo de Bateria em Apps: Comparativo e Guia Rapido
- Progressive Web Apps para iniciantes: exemplos e otimização sem complicar
- PWA para startups: quando o Progressive Web App é a aposta certa
- PWA: o que é e como cuidar da performance no dia a dia