Laboratório educacional para estudar performance em JavaScript e entender como diferentes implementações se comportam no Node.js/V8.
O projeto reúne pequenos benchmarks de operações comuns, como loops, transformação de arrays, conversão de valores, expressões regulares e execução assíncrona. Todos usam o mesmo runner, possuem testes funcionais e geram métricas comparáveis no terminal e em JSON.
Este projeto existe somente para estudo e experimentação. Os resultados não são recomendações para código de produção e não demonstram que uma abordagem será sempre mais rápida. Hardware, sistema operacional, versão do Node, carga da máquina, formato dos dados e contexto da aplicação alteram os resultados.
| # | Estudo | Arquivo |
|---|---|---|
| 1 | Remoção de propriedades com forEach, for...of e map |
benchmarks/01-map-vs-foreach.js |
| 2 | Lodash isEmpty vs objeto nativo |
benchmarks/02-is-empty-object.js |
| 3 | Date.now() vs new Date().getTime() vs +new Date |
benchmarks/03-date-now-vs-gettime-vs-unary-plus.js |
| 4 | String() vs .toString() vs template literal |
benchmarks/04-string-vs-tostring-vs-template-literal.js |
| 5 | !!value vs .length > 0 |
benchmarks/05-boolean-vs-double-negation.js |
| 6 | for assíncrono vs Promise.all |
benchmarks/06-async-for-vs-promise-all.js |
| 7 | Lodash uniqBy vs array nativo |
benchmarks/07-uniqby-vs-native-array.js |
| 8 | RegExp pré-compilada vs inline | benchmarks/08-regexp-precompiled-vs-inline.js |
| 9 | for, forEach, for...of e map |
benchmarks/09-for-vs-foreach-vs-forof-vs-map.js |
| 10 | Array.from().map vs Array.prototype.map.call |
benchmarks/10-array-from-map-vs-map-call.js |
| 11 | reduce vs for vs forEach |
benchmarks/11-reduce-vs-for-vs-foreach.js |
| 12 | Loops com concatenação | benchmarks/12-loops.js |
Alguns estudos incluem casos propositalmente incorretos ou abordagens com diferenças semânticas. Eles permanecem identificados no código e nos testes para demonstrar por que comparar apenas o tempo pode levar a conclusões erradas.
O projeto usa Node.js 24, definido em .nvmrc e em engines.node.
nvm install
nvm use
npm install
npm run benchmarkPara executar somente um estudo:
node benchmarks/03-date-now-vs-gettime-vs-unary-plus.jsCada execução completa também salva um arquivo results/benchmark-<data>.json com:
- data e duração da execução;
- versões do Node.js e V8;
- sistema operacional, arquitetura, CPU e memória;
- métricas e vencedor de cada estudo.
O runner usa performance.now() de node:perf_hooks, faz warm-up e mede várias iterações distribuídas em amostras. A tabela é ordenada do menor para o maior tempo médio.
- Média/op: tempo médio de uma operação;
- Mediana: valor central das amostras;
- Mínimo/Máximo: extremos observados;
- Ops/s: estimativa de operações por segundo;
- Vs mais rápido: multiplicador em relação ao vencedor;
2.00xsignifica o dobro do tempo.
O troféu indica apenas o vencedor daquela execução. Antes de otimizar código real, use um profiler no cenário da aplicação e considere semântica, legibilidade e manutenção.
benchmarks/ estudos executáveis
scripts/ execução agregada e histórico
src/ runner e cálculos estatísticos
test/ testes com node:test
results/ históricos em JSON
docs/ material original de apoionpm test
npm run lint
npm run format:checkO exemplo mínimo de uso do runner está em src/runner-demo.js. Para adicionar ou alterar estudos, consulte o guia de contribuição.
Distribuído sob a licença ISC.