PRODPlataforma BaaS europeia soberanaAbra o painel →

Desempenho · 12 minutos de leitura

Rust vs Node.js: benchmark de backend e latência

Affane Daylami · Fondateur · 5 de julho de 2026

Voltar ao blog

Em um banco de comunidade independente atualizado em agosto de 2025, todas as estruturas Rust executam entre 18.000 e 22.000 solicitações por segundo com 1,4 a 1,7 ms de latência. Estruturas Node.js equivalentes limitam entre 5.766 e 9.340 req/s, de 3,4 a 5,5 ms, no mesmo hardware (Sharkbench, 24 de agosto de 2025).

Este texto em inglês foi gerado automaticamente a partir do original em francês e ainda não foi revisado.
Esta página foi traduzida automaticamente. A versão em inglês é oficial.

Não fomos nós que gerimos esta bancada: trata-se de números de terceiros, públicos, fornecidos e datados. Este artigo detalha o que eles dizem, a metodologia por trás disso e o que realmente muda para uma escolha de back-end – não uma comparação entre Aurabase e um concorrente.

O núcleo do Aurabase roda em Rust, em axum e tokio — verificado no Cargo.toml do monorepo, dez serviços compartilhando a mesma dependência. Mas não publicámos quaisquer números de desempenho próprios até à data. Se você procura uma latência precisa do Aurabase, ela ainda não existe: a metodologia virá antes do número, e não o contrário.

O essencial

  • No Sharkbench (banco comunitário, Ryzen 7 7800X3D, Docker/Linux, 24/08/2025): Actix, Hyper, Axum e Rocket estão todos rodando entre 18.047 e 21.965 req/s a 1,4-1,7 ms. Fastify, Koa e Express limitam entre 5.766 e 9.340 req/s no lado do Node.js, em 3,4-5,5 ms.
  • O tempo de execução pesa tanto quanto a linguagem: o mesmo código Express vai de 5.766 req/s no Node.js para 18.917 req/s no Bun — um fator ×3,3 sem alterar uma linha.
  • A lacuna de memória é a mais clara: 8,5 MB para Axum versus 82,5 MB para Express/Node.js — consistente com a ausência do coletor de lixo do Rust.
  • Aurabase não publicou nenhum benchmark próprio até o momento. O núcleo Rust/axum/tokio é verificado no código – não no desempenho.
  • Um número isolado não prova nada: hardware, versão da estrutura, tamanho da carga útil e nível de competição variam mais a classificação do que apenas a linguagem.
#
O banco

O que mostra uma bancada recente de terceiros

Sharkbench é um projeto comunitário independente que mede três coisas: a capacidade de uma estrutura de lidar com solicitações HTTP simultâneas, operações de E/S e serialização JSON. O teste é executado no Docker/Linux em um Ryzen 7 7800X3D, com uma última atualização pública em 24 de agosto de 2025 (sharkbench.dev/web, acessado em 24 de agosto de 2026).

Taxa de transferência em solicitações por segundo, Rust vs Node.jsActix (Rust) 21.965 req/s, Hyper (Rust) 21.781 req/s, Axum (Rust) 21.030 req/s, Rocket (Rust) 18.047 req/s, Fastify (Node.js) 9.340 req/s, Koa (Node.js) 8.828 req/s, Express (Node.js) 5.766 solicitações/s. Fonte: Sharkbench, 24 de agosto de 2025.05k10k15k20kActix (ferrugem)21 965Hiper (ferrugem)21 781Axum (ferrugem)21 030Foguete (ferrugem)18 047Fastificar (Node.js)9 340Koa (Node.js)8 828Expresso (Node.js)5 766

Fonte: Sharkbench, 24 de agosto de 2025 – Docker/Linux, Ryzen 7 7800X3D.

Axum — a estrutura que o Aurabase usa para seu núcleo Rust, verificado em Cargo.toml — processa 21.030 solicitações por segundo neste banco. Express, o framework Node.js mais utilizado em produção, processa 5.766 no mesmo hardware: um fator de 3,6. Este não é um caso isolado. As quatro estruturas Rust testadas estão todas dentro de uma faixa estreita de 18.000 a 22.000 req/s, enquanto as três estruturas Node.js testadas atingem um limite entre 5.766 e 9.340.

Na prática, “req/s” mede a taxa de transferência sob carga simultânea sustentada – e não a velocidade de uma solicitação isolada em um site de baixo tráfego. Para um endpoint chamado uma vez a cada poucos segundos, a diferença nunca é vista. Torna-se decisivo em um endpoint ativo — um fluxo em tempo real, uma API pública com tráfego pesado, um trabalho que reúne milhares de chamadas — onde o número de solicitações processadas por núcleo de CPU, para hardware igual, define diretamente a conta da infraestrutura.

#
Latência

A latência segue o mesmo padrão

A latência média segue a mesma hierarquia nesta bancada: 1,4 a 1,7 ms para os frameworks Rust testados, em comparação com 3,4 a 5,5 ms para os frameworks Node.js testados.

Latência média em milissegundos, Rust vs Node.jsActix (Rust) 1,4 ms, Hyper (Rust) 1,5 ms, Axum (Rust) 1,6 ms, Rocket (Rust) 1,7 ms, Fastify (Node.js) 3,4 ms, Koa (Node.js) 3,6 ms, Express (Node.js) 5,5 ms. Fonte: Sharkbench, 24 de agosto de 2025.0ms1ms2ms3ms4ms5msActix (ferrugem)1,4msHiper (ferrugem)1,5msAxum (ferrugem)1,6msFoguete (ferrugem)1,7msFastificar (Node.js)3,4msKoa (Node.js)3,6msExpresso (Node.js)5,5ms

Fonte: Sharkbench, 24 de agosto de 2025 – latência média, não p99.

Este número é uma média, não um p99. As pausas de lixo em um tempo de execução gerenciado afetam principalmente a fila de despacho — as solicitações mais lentas, não a mediana. Este é o assunto de um artigo dedicado nesta série: por que a ausência do coletor de lixo altera a latência p99.

#
Por que

Por que Rust não tem folga de GC para pagar

Rust gerencia a memória por propriedade, verificada em tempo de compilação – nenhum coletor de lixo rodando em segundo plano e interrompendo a execução. O Rust Book oficial resume da seguinte forma: “Nenhum dos recursos de propriedade irá desacelerar seu programa enquanto ele está em execução” (The Rust Programming Language, doc.rust-lang.org, acessado em 24 de agosto de 2026). A memória é liberada assim que a variável que a possui sai do escopo — um tempo conhecido em tempo de compilação, não uma pausa imprevisível em tempo de execução.

ownership.rsrust
fn main() {
    let data = String::from("réponse API"); // `data` possui a string
    process(data); // posse sai daqui
    // `data` não é mais válido aqui - sem ponteiro pendente, sem liberdade dupla
} // `data` é liberado aqui, de forma determinística

fn process(s: String) {
    println!("{s}");
} // `s` sai do escopo aqui: liberação imediata, sem passagem de coleta de lixo

O Node.js, por outro lado, é executado em um único thread JavaScript e delega operações de E/S ao kernel por meio de um loop de eventos multifásico (temporizadores, retornos de chamada diferidos, pesquisa, verificação...) - mas qualquer cálculo síncrono nesse thread, incluindo uma passagem de coleta de lixo do mecanismo V8, bloqueia a execução enquanto ele é executado (documentação oficial do Node.js, nodejs.org, acessado em agosto 24, 2026). Esta é uma diferença no modelo de memória, não um detalhe de implementação.

#
A nuance

A verdadeira surpresa: o tempo de execução pesa tanto quanto a linguagem

O resultado mais contra-intuitivo da mesma bancada não diz respeito ao Rust: diz respeito ao próprio Node.js. Express - o mesmo código, a mesma API - vai de 5.766 req/s no Node.js para 18.917 req/s no Bun, um fator de ×3,3, sem alterar uma linha de código do aplicativo (Sharkbench, 24 de agosto de 2025).

Taxa de transferência expressa de acordo com o tempo de execução do JavaScript, em comparação com AxumAxum em Rust: 21.030 req/s. Expresso no Pão: 18.917 req/s. Expresso em Deno: 6.088 req/s. Expresso em Node.js: 5.766 req/s. O mesmo código Express em todos os três casos. Fonte: Sharkbench, 24 de agosto de 2025.05k10k15k20kAxum (ferrugem, referência)21 030Expresso no Pão18 917Expresso em Deno6 088Expressar em Node.js5 766

Fonte: Sharkbench, 24 de agosto de 2025 – mesmo código Express, três tempos de execução JavaScript.

No Deno, esse mesmo código Express atinge 6.088 req/s – próximo ao Node.js, longe do Bun. A linguagem JavaScript é idêntica nos três casos; É o tempo de execução — seu mecanismo JS, sua implementação de loop de eventos, sua coleta de lixo — que muda o jogo. Comparar “Rust” com “Node.js” sem especificar o tempo de execução, versão e estrutura é como comparar configurações, não idiomas.

E entrar nisso tudo?

Neste mesmo banco, a estrutura Go Gin atinge o pico de 3.546 req/s quando FastHTTP - ainda em Go - sobe para 5.567 req/s com uma latência de apenas 0,7 ms (Sharkbench, 24 de agosto de 2025). Dois resultados muito diferentes para uma única língua: uma figura isolada nunca resume um ecossistema inteiro.

#
Metodologia

Por que um único número de referência nunca é suficiente

TechEmpower Framework Benchmarks ilustra a mesma ideia em uma escala maior. Seu repositório de código aberto foi atualizado em 24 de março de 2026, e sua rodada mais recente (rodada 23) foi objeto de uma postagem datada de 16 de março de 2026 (TechEmpower, acessado em 24 de agosto de 2026). Este projeto executa muitos tipos de testes em centenas de implementações, precisamente porque um único teste nunca representa um framework, muito menos uma linguagem.

A Convex, player no mercado de bancos de dados, formulou a posição mais clara sobre o assunto: recusar-se a participar da “guerra de gráficos de barras” de marketing entre bancos de dados concorrentes, considerada enganosa. “É escalar o teatro, não escalar”, escreve a equipe (Convex, acessado em 24 de agosto de 2026). Compartilhamos esta leitura: um número simples, sem metodologia publicada, não prova nada – nem para um concorrente, nem para nós.

O que isso muda em termos concretos: hardware (CPU, RAM), versão exata da estrutura e tempo de execução, tamanho da carga JSON, nível de competição e duração do teste, tudo varia na classificação – às vezes mais do que a escolha da linguagem em si. Um banco que não publica esses parâmetros não reproduz, portanto não se verifica — veja nossa metodologia completa e reproduzível para benchmarking de um backend.

#
Aurabase

E a Aurabase nisso tudo?

O backend principal do Aurabase é escrito em Rust, em axum e tokio - verificado no Cargo.toml do monorepo: dez serviços (aura-gateway, aura-auth, aura-db…) compartilham a mesma dependência de espaço de trabalho axum (0.8) e o mesmo tempo de execução tokio, na edição 2021. O gateway que roteia o tráfego do plano de dados e do plano de gerenciamento depende de hyper além de axum - os detalhes completos estão em nosso artigo sobre a arquitetura do plano de dados/plano de gerenciamento do gateway. A estrutura do espaço de trabalho Cargo que suporta esses dez serviços está documentada em nosso artigo sobre o espaço de trabalho Cargo.

O que ainda não temos é um número publicado de taxa de transferência ou latência do Aurabase com metodologia e hardware documentados. Isto é deliberado: preferimos publicar a metodologia antes da figura e não o contrário — este é o assunto de um artigo futuro nesta série.

Para a comparação completa da arquitetura - núcleo Rust unificado na Aurabase versus pilha heterogênea Elixir/Go/TypeScript/Node documentada em um concorrente direto - veja nossa comparação detalhada Aurabase vs Supabase. Se você já estiver migrando um projeto, o guia de migração Supabase para Aurabase cobre o esquema, as políticas RLS e o SDK.

#
Dados

Apêndice: tabela de dados completa

Todas as linhas citadas neste artigo, conforme publicado pelo Sharkbench em 24 de agosto de 2025 (Docker/Linux, Ryzen 7 7800X3D).

EstruturaTempo de execuçãoSolicitaçõesLatênciaMemória
ActixFerrugem21 9651,4ms16,6MB
HiperFerrugem21 7811,5ms8,6MB
AksumFerrugem21 0301,6ms8,5MB
FogueteFerrugem18 0471,7ms6,4MB
FastificarNode.js9 3403,4ms57,0MB
KoaNode.js8 8283,6ms53,3MB
ExpressoNode.js5 7665,5ms82,5MB
ExpressoPão18 9171,3ms53,3MB
ExpressoDeno6 0885,0ms130,7MB
GimVá3 5461,0ms16,7MB
FastHTTPVá5 5670,7ms13,4MB

Cite estes dados: Sharkbench, “Web Framework Benchmarks,” sharkbench.dev/web, atualizado pela última vez em 24 de agosto de 2025.

#
Perguntas frequentes

Perguntas frequentes

Isso significa que o Node.js é uma má escolha?+
O Node.js continua sendo uma escolha sólida para muitos back-ends, especialmente quando a equipe já é proficiente em TypeScript e a carga não é dominada pela computação da CPU. A lacuna medida aqui está no rendimento bruto e na latência sob alta competição – e não na produtividade do desenvolvimento ou no ecossistema de pacotes. No Bun, a diferença com o Rust é reduzida significativamente (18.917 req/s para Express em comparação com 21.030 para Axum): a escolha do tempo de execução é tão importante quanto a escolha do idioma.
Por que o Express é tão lento em comparação com outras estruturas Node.js?+
Neste banco, Express (5.766 req/s em Node.js) é o mais lento dos frameworks Node.js testados, atrás de Koa (8.828) e Fastify (9.340). O Express data de 2010 e seu design favorece a simplicidade do middleware em vez do rendimento bruto. Ao mesmo tempo de execução, a escolha do framework já deixa uma lacuna de ×1,6 entre Express e Fastify (Sharkbench, 24 de agosto de 2025).
Como esse benchmark foi alcançado e podemos reproduzi-lo?+
O banco citado neste artigo vem do Sharkbench, um projeto de comunidade independente que testa solicitações HTTP simultâneas, E/S e serialização JSON no Docker/Linux, em um Ryzen 7 7800X3D, com uma atualização pública final em 24 de agosto de 2025 (sharkbench.dev/web). Este não é um banco Aurabase – nós mesmos não o executamos nem validamos; nós o citamos porque sua metodologia e materiais são publicados, ao contrário de muitas figuras de marketing.
A Aurabase publicou seus próprios benchmarks?+
Não, não até hoje. O núcleo Rust/axum/tokio do Aurabase é verificado no código-fonte monorepo, mas nenhum valor de rendimento ou latência específico do Aurabase foi medido e publicado. Este artigo compara Rust e Node.js em geral, com base em bancos de terceiros - esta não é uma comparação do Aurabase com um concorrente.
Uma diferença no rendimento e na memória, que diferença isso faz na conta de infraestrutura?+
No banco citado, Axum consome 8,5 MB de memória em comparação com 82,5 MB do Express em Node.js — um fator próximo de ×10 (Sharkbench, 24 de agosto de 2025). Menos memória por instância e mais solicitações processadas por núcleo de CPU tornam possível, para tráfego igual, manter a mesma carga com menos ou menores instâncias. O impacto real, no entanto, depende do seu perfil de carga (ligado à E/S ou à CPU) e ao seu provedor de nuvem — esse número não é uma promessa de economia automática.
#
Conclusão

O que lembrar

Na bancada citada aqui, todas as estruturas Rust são executadas em uma faixa estreita - 18.000 a 22.000 req/s, 1,4-1,7 ms - muito à frente das estruturas Node.js no próprio Node.js (5.766-9.340 req/s, 3,4-5,5 ms). Mas o tempo de execução muda a situação tanto quanto a linguagem: Express on Bun quase alcança Axum on Rust.

Se você avaliar um back-end apenas com base no desempenho bruto, exija a metodologia antes do número: hardware, versão, tamanho da carga útil, nível de competição. A Aurabase ainda não divulgou seus próprios números; quando isso acontecer, a metodologia virá em primeiro lugar.

PRONTO PARA IMPLEMENTAR?

Seu back-end em cinco minutos.

Não é necessário cartão de crédito · 500 MB grátis · 50.000 MAU