Voltar para artigos
Performance
4 min
4 de janeiro de 2026

Node.js vs Go: Benchmark Completo com NestJS, Gin e PostgreSQL

Testei 800 conexões simultâneas, operações de banco, CPU-bound e mais. Os números não mentem.

Toda discussão sobre "qual linguagem é melhor" costuma terminar em opiniões. Decidi acabar com o achismo criando duas APIs idênticas, uma em NestJS (Node.js) e outra em Gin (Go), com PostgreSQL, e executando benchmarks de produção real.


O Setup

  • Hardware: MacBook Pro M1, 16GB RAM
  • Banco: PostgreSQL 16 (Docker)
  • Ferramenta: wrk (HTTP benchmark)

Ambas as APIs implementam os seguintes requisitos:

  • Endpoints de CPU (JSON, hash, fibonacci)
  • Endpoints de banco (CRUD, agregação)
  • Pool de conexões com 20 conexões máximas

Os Resultados

🚀 Performance Pura (Sem Banco)

TesteNestJSGinVantagem Go
Health Check16k req/s93k req/s5.8x
JSON (100 obj)4.3k req/s28k req/s6.4x
Fibonacci (n=30)96 req/s1.8k req/s19x
Bcrypt Hash64 req/s91 req/s1.4x

Destaques:

  • O Go é 19x mais rápido em processamento CPU-bound puro.
  • Em bcrypt, a diferença cai para 1.4x, pois o Node utiliza bindings em C.

🔥 Stress Test (800 conexões, 45 segundos)

MétricaNestJSGin
Requests/sec16k90k
Latência p9963ms15ms
Timeouts4810

O dado mais crítico: O NestJS apresentou 481 timeouts, enquanto o Gin teve zero. Em produção, timeouts representam clientes recebendo erros diretamente.

🗄️ Com PostgreSQL (200 conexões)

OperaçãoNestJSGinVantagem Go
SELECT 1 row7.7k req/s18.7k req/s2.4x
SELECT 100 rows4.7k req/s9.3k req/s2.0x
Aggregation7.7k req/s13.4k req/s1.7x

Insight: A diferença caiu de uma escala de 5-19x para um intervalo entre 1.7x e 2.4x. Isso indica que o banco de dados se torna o gargalo principal do sistema.

A latência p99, contudo, continua muito diferente:

  • List 100 rows: NestJS 158ms vs Gin 33ms (uma latência 4.7x menor).

💾 Uso de Memória

MomentoNestJSGin
Startup68 MB11 MB
Após stress85 MB52 MB

O Go consome entre 40% e 80% menos memória que o Node.js em cenários similares.


O Que Isso Significa na Prática

✅ Use Go (Gin) quando:

  1. A performance for crítica: APIs que precisam sustentar volumes superiores a 10k req/s.
  2. O domínio for CPU-bound: tarefas intensas de processamento e transformações de dados.
  3. A latência p99 for prioridade: casos com SLAs (Service Level Agreements) muito apertados.
  4. Os recursos forem limitados: ambientes de Kubernetes com limites rígidos de memória.
  5. Houver necessidade de estabilidade sob carga: situações onde evitar timeouts for essencial.

✅ Use Node.js (NestJS) quando:

  1. A prioridade for velocidade de desenvolvimento: aproveitando recursos como TypeScript, Injeção de Dependência e decorators.
  2. O time for focado em JavaScript: reduzindo drasticamente a curva de aprendizado.
  3. O domínio for I/O-bound: situações onde a diferença de performance no banco de dados é aceitável para o negócio.
  4. Depender do ecossistema NPM: necessidade de bibliotecas específicas já consolidadas na comunidade.

Reproduza Você Mesmo

# Clone o repositório git clone https://github.com/zghost10/go-vs-node.git # Inicie PostgreSQL docker-compose up -d # Inicie as APIs cd nestjs-api && npm install && npm run build && node dist/main.js & cd gin-api && go build && ./gin-api & # Benchmark wrk -t8 -c800 -d45s --latency http://localhost:3000/health wrk -t8 -c800 -d45s --latency http://localhost:8080/health wrk -t4 -c200 -d15s --latency http://localhost:3000/db/users/active wrk -t4 -c200 -d15s --latency http://localhost:8080/db/users/active