Se você está começando agora no mundo da programação ou quer entender melhor como funciona a performance dos seus algoritmos, este artigo é pra você!
Hoje vamos bater um papo sobre um conceito fundamental para quem programa: Big O, também conhecido como complexidade de tempo e espaço. Pode parecer coisa de outro mundo, mas eu prometo que você vai sair deste texto entendendo tudo direitinho. E mais: com exemplos práticos usando NestJS!
Vamos nessa?
O que é Big O?
A notação Big O é uma forma de descrever como o tempo de execução de um algoritmo cresce de acordo com o tamanho da entrada. Em outras palavras, ela nos ajuda a estimar o quanto um algoritmo pode ficar lento (ou não) conforme lidamos com mais dados.
Por que isso importa?
Imagine você construindo uma API com NestJS que vai manipular uma lista de usuários. Será que ela continua rápida quando tiver 10 usuários? E quando tiver 10.000?
Entender a complexidade de tempo e espaço vai te ajudar a evitar soluções lentas e ineficientes.
Principais Notações de Complexidade
Aqui estão as mais comuns que você precisa conhecer:
O(1) – Tempo Constante
Um algoritmo que roda em tempo constante executa na mesma velocidade, independente do tamanho da entrada.
// Exemplo com NestJS - Buscar configurações do sistema
@Get('status')
getStatus(): string {
return 'API está rodando!';
}
Neste caso, não importa quantos dados o sistema tenha: ele sempre vai responder da mesma forma.
O(n) – Tempo Linear
O tempo de execução cresce proporcionalmente ao tamanho da entrada.
// Exemplo - Buscar todos os usuários
@Get('users')
async getUsers(): Promise<User[]> {
return this.userService.findAll();
}
Se houver 10 usuários, serão feitas 10 leituras. Se houver 1.000, serão feitas 1.000. É linear.
O(n^2) – Tempo Quadrático
O tempo de execução aumenta exponencialmente com a entrada.
// Exemplo didático - Comparando todos os usuários com todos
@Get('users/compare')
async compareUsers(): Promise<any[]> {
const users = await this.userService.findAll();
const comparisons = [];
for (let i = 0; i < users.length; i++) {
for (let j = 0; j < users.length; j++) {
comparisons.push([users[i], users[j]]);
}
}
return comparisons;
}
Se você tiver 100 usuários, serão feitas 10.000 comparações!
O(log n) – Tempo Logarítmico
Muito eficiente. Usado, por exemplo, em algoritmos de busca binária.
// Exemplo ilustrativo de busca binária
function buscaBinaria(arr: number[], target: number): boolean {
let inicio = 0;
let fim = arr.length - 1;
while (inicio <= fim) {
const meio = Math.floor((inicio + fim) / 2);
if (arr[meio] === target) return true;
if (arr[meio] < target) inicio = meio + 1;
else fim = meio - 1;
}
return false;
}
Complexidade de Espaço
A ideia aqui é parecida: queremos saber quanta memória um algoritmo usa em função do tamanho da entrada.
Exemplo prático
// Cria um novo array duplicado
function duplicaArray(arr: number[]): number[] {
return [...arr, ...arr]; // usa o dobro de memória
}
Nesse caso, o espaço usado é O(n), pois depende diretamente do tamanho do array original.
Dicas para Melhorar a Performance no NestJS
1. Evite loops aninhados sempre que possível
Eles são os grandes vilões da performance. Prefira usar buscas indexadas ou map/reduce sempre que possível.
2. Trabalhe com streams ou paginação
Se você estiver lidando com muitos dados, implemente paginação ou use RxJS streams para reduzir a carga de memória.
3. Use bancos com índices bem definidos
Uma busca com índice é muito mais rápida. Consulte a documentação do TypeORM ou do Prisma para definir isso corretamente.
Conclusão
A notação Big O pode parecer um bicho de sete cabeças no começo, mas ela é uma das ferramentas mais valiosas para qualquer programador. Saber analisar e otimizar a complexidade de tempo e espaço vai fazer você criar aplicações mais rápidas, responsivas e escaláveis.
Com o NestJS, é perfeitamente possível aplicar boas práticas de performance desde o início do seu projeto. Fique de olho na forma como você manipula dados e aproveite os recursos da plataforma!
Agora é com você!
Gostou do conteúdo? Ficou com alguma dúvida ou tem uma sugestão de melhoria? Deixe seu comentário aqui embaixo! Vamos conversar! 😊
Se você curtiu o artigo, compartilhe com seus amigos desenvolvedores e ajude a espalhar conhecimento!
Ate a próxima! 🚀