Skip to content

didof/libuv-threadpool-benchmarks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Benchmark sul Thread Pool di libuv in Node.js

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.

Prerequisiti

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.

Installazione

Clona la repository e installa le dipendenze necessarie:

git clone <url-della-tua-repo>
cd libuv-benchmarks
pnpm install

Utilizzo

Il progetto include due script principali per eseguire i test.

1. Test Rapido (time.js)

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

2. Benchmark e Grafico (graph.js)

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.

Modificare la Dimensione del Thread Pool

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.

About

Aspetta, quindi Promise.all no fa veramente parallelismo? Beh, è leggermente più complicato di così.

Topics

Resources

Stars

Watchers

Forks