Questo progetto contiene una serie di script per dimostrare e visualizzare l'impatto della dimensione del thread pool di libuv
sulle performance di operazioni asincrone CPU-bound in Node.js.
L'esperimento mostra come, contrariamente a una credenza comune, Promise.all
non garantisce un parallelismo infinito, ma è limitato da un pool di thread (di default 4) per certi tipi di operazioni.
Per eseguire questo progetto, assicurati di avere installato:
- Node.js: Versione 18.x o superiore.
- pnpm: Un gestore di pacchetti veloce ed efficiente. Puoi installarlo con
npm install -g pnpm
.
Clona la repository e installa le dipendenze necessarie:
git clone <url-della-tua-repo>
cd libuv-benchmarks
pnpm install
Il progetto include due script principali per eseguire i test.
Questo script esegue un numero specifico di task pesanti e stampa il tempo totale di esecuzione. È utile per un test veloce.
Comando:
# Esegue 10 task pesanti in parallelo
node scripts/time.js 10
Questo è lo script principale. Esegue una serie di benchmark, da 1 fino a N task, e genera un'immagine PNG (benchmark-graph.png
) con un grafico che visualizza le performance.
Comando:
# Esegue benchmark da 1 a 16 task e genera il grafico
node scripts/graph.js 16
Al termine dell'esecuzione, troverai un grafico nella cartella graphs
.
Il cuore dell'esperimento è la variabile d'ambiente UV_THREADPOOL_SIZE
. Impostandola prima di lanciare lo script, puoi controllare quanti thread libuv
utilizzerà.
Esempio (Linux/macOS):
# Esegui il benchmark con un thread pool di 8
UV_THREADPOOL_SIZE=8 node scripts/graph.js 16
Esempio (PowerShell, Windows):
# Imposta la variabile per la sessione corrente e poi esegui
$env:UV_THREADPOOL_SIZE=8; node scripts/graph.js 16
Confrontando i grafici generati con diverse dimensioni del thread pool (es. 4, 8, 16, e un valore superiore al numero di core della tua CPU) potrai vedere chiaramente l'impatto sulle performance.