Benchmark

Quattro client, sette scenari, hardware e provider identici, esecuzioni alternate così la deriva dei provider si annulla. La metrica è il tempo per un file utilizzabile: scaricato, verificato, estratto. Comprese le prove che non vinciamo.

In questa pagina

Prima la metodologia

L'impostazione

Scenario 1 · pulito, enorme

190.6 GB → singolo mkv da 167.9 GB (Europa, 10 GbE)

nzbfast4m 33s
NZBGet 26.27m 58s · +75%
SABnzbd 5.0.419m 32s · +329%
rustnzb 1.3.4nessun output¹
nzbfastNZBGet 26.2SABnzbd 5.0.4rustnzb 1.3.4
tempo per file utilizzabile4m 33s7m 58s (+75%)19m 32s (+329%)nessuno¹
GB sulla rete169.6169.8169.7186.5
picco RSS1.4 GB²1.5 GB1.8 GB0.6 GB

¹ rustnzb ha finito di spostare byte a 5m 42s dopo aver scaricato 186.5 GB (il 10% di rete in più di chiunque altro) ma non ha lasciato alcun media estratto, il suo terzo giro fallito di fila su questo post. · ² la memoria di nzbfast segue il suo budget configurato, non il job: questa prova ha usato il budget automatico predefinito e ha toccato un picco di 1.4 GB; un budget volutamente enorme da 64 GB guadagna solo il 4% (4m 22s), e limitato a 1 GB lo stesso job da 190 GB si completa comunque (vedi la scala a bassa memoria qui sotto). Nel precedente giro sulla costa est (linea ~2.4–3 Gbps) lo stesso scenario ha girato in 9m 00s contro NZBGet +30% e SABnzbd +111%. Il divario regge a ogni velocità di linea.

Scenario 2 · il divario cresce con la dimensione

Tempo per file utilizzabile, per dimensione del job

Passata unica significa nessuna passata di verifica/estrazione dopo il download, quindi più grande è il job, più stacca. Esecuzioni sequenziali sulla stessa macchina:

JobnzbfastNZBGetSABnzbd
7.4 GB REMUX (Europa, 10 GbE)13.7 s17.3 s (+26%)19.0 s (+39%)
35 GB 4K offuscato (Europa)67 s108 s (+61%)285 s (+325%)
87 GB 4K (costa est)272 s370 s (+36%)708 s (+160%)
87 GB su un disco con 97 GB liberi (Europa)3m 08simpossibile²impossibile²
190.6 GB (costa est)9m 00s11m 43s (+30%)19m 02s (+111%)

² La loro impronta di picco (volumi + output estratto contemporaneamente, ~156 GB) ha superato i 97 GB liberi. La passata unica richiede 1× la dimensione del contenuto: dimezza il disco che serve, non solo il tempo.

Scenario 3 · post offuscato

35 GB 4K con nome hash → mkv utilizzabile (costa est)

nzbfastNZBGetSABnzbdrustnzb
tempo per file utilizzabile96 s153 s (+59%)259 s (+170%)nessun file utilizzabile³
picco RSS1.55 GB3.7 GB8.8 GB3.6 GB

³ rustnzb ha scaricato in 119 s, ha segnato il job come Completato, e ha consegnato i volumi offuscati grezzi: nessuna rinomina, nessuna estrazione. nzbfast ha deoffuscato dai metadati PAR2 ed estratto nel flusso, zero blocchi riletti.

Scenario 4 · coda di tre

Tenere accesa la linea lungo una coda (costa est, ~43 GB)

nzbfastrustnzbNZBGetSABnzbd
tempo totale della coda122 s136 s162 s277 s
linea inattiva (<20 MB/s)2 s (2%)16 s (12%)0 s168 s (61%)

Tre forme dello stesso problema: la sovrapposizione tra la fine di un job e l'inizio del successivo in nzbfast tiene la linea occupata da un capo all'altro; NZBGet non è mai inattivo ma va ~35% più lento estraendo in parallelo; SABnzbd scarica veloce, poi lascia la linea al buio per il 61% del tempo durante la post-elaborazione seriale. Nella variante di resilienza (un job con header RAR cifrati), la coda di SABnzbd si è bloccata sul job cifrato e solo 1 job su 3 è arrivato a completarsi; nzbfast lo ha parcheggiato con un messaggio chiaro e ha finito il resto.

La colonna dell'onestà

Le prove che non vinciamo

Entrambe le prove che stavano qui sono state rimisurate sulla build pubblicata e nessuna è più una sconfitta: il post store-mode danneggiato ora ci costa 30 s contro i 38 s di NZBGet, e la ricostruzione dalla sola parità si chiude in 9 s dove ne servivano 19, su una prova in cui NZBGet torna nello stesso tempo ma non consegna nulla. Lasciamo la sezione al suo posto invece di cancellarla: è qui che finiscono le nostre sconfitte, e il prossimo giro che ne troverà una la rimetterà.

Perché mostrare una sconfitta? Perché le vittorie sono credibili solo accanto ad essa. Ogni numero in questa pagina proviene dalle stesse esecuzioni alternate, e una prova che perdiamo resta pubblicata finché una nuova esecuzione non la sostituisce.

Scenario 6 · affamalo di RAM

La scala a bassa memoria: 190 GB in ~1.1 GB di RAM

Gli stessi quattro job, ri-eseguiti con budget di memoria rigidi di 2 GB, 1 GB e 256 MB: ciò che il dimensionatore automatico sceglierebbe su una macchina da 8 GB, una da 4 GB e un NAS da 2 GB. Ogni prova ha prodotto un file corretto, pienamente verificato ed estratto; il picco RSS ha seguito il budget, non il job. Tempo per file utilizzabile, linea 10 GbE:

Dimensione jobRAM abbondantebudget 2 GBbudget 1 GBbudget 256 MB
7 GB15 s15 s15 s15 s
35 GB65 s70 s70 s65 s
87 GB148 s206 s196 s180 s
190 GB330 s427 s402 s411 s

Il sovrapprezzo del 20–40% sui job grandi è un artefatto del 10 GbE: i blocchi spillati costano tempo solo quando la linea supera il disco. Lo stesso job da 87 GB agli stessi budget su una linea ~2.4 Gbps ha misurato da −1% a +7%, rumore. Su una tipica connessione domestica un budget piccolo è quasi gratis a qualsiasi dimensione di job. Un profilo NAS (2 connessioni, budget 256 MB) ha finito il job da 35 GB con un picco RSS di 0.4 GB. Un NAS da 2 GB può farlo girare. Nessun altro client offre alcun tetto di memoria.

Scenario 7 · archivi dentro archivi

Dieci forme annidate: chi finisce senza di te

I post arrivano sempre più spesso annidati: un RAR dentro un RAR, un 7z infilato in un archivio in modalità store, una scala di strati, una catena di password. Questo giro valuta ciò che resta da fare all'operatore. auto significa ogni payload estratto, byte-identico, senza toccare nulla; manuale significa che il client ha dichiarato successo ma ha lasciato un archivio interno nella directory di output, da aprire da soli.

formanzbfastSABnzbdNZBGetrustnzb
RAR store dentro RAR storeautoautomanualemanuale
RAR compresso dentro RAR storeautoautomanualemanuale
7z dentro un RAR storeautoautomanualemanuale
scala a 5 livelli, 6 payloadauto · 6/6manuale · 3/6manuale · 1/6manuale · 1/6
catena di password, 3 livelli cifratiauto · 3/3chiede una passwordchiede una passwordfallito
completamento automatico, tutte e dieci le forme8/106/102/102/10

Banco in loopback, corpus generato a macchina, tutti e quattro i client sulla stessa macchina, valutazione tramite hash del contenuto, così un client che rinomina il payload riceve comunque il merito. Poiché gli strati interni vengono de-annidati al volo, nzbfast tiene una sola copia da ~1.5 GB su disco dove i client «scrivi e poi estrai» ne tengono ~3 GB, e chiude queste prove in 1–2 s contro 4–8 s. Nella catena di password, la password di ogni strato viaggia in un file che lo strato sopra estrae: nzbfast la legge e sblocca tutti e tre i livelli; gli altri si fermano e aspettano che la digiti tu. Le due forme che non completa da solo sono valutate duramente di proposito: una scala a 10 livelli oltre il suo limite di profondità predefinito e un post danneggiato a tutti e tre i livelli. In entrambe recupera più payload di qualunque altro client, ma esce con codice diverso da zero invece di chiamare successo un lavoro parziale, quindi qui contano entrambe come fallimenti.

Sfide tra componenti

I motori di estrazione e riparazione, in gara da soli

Estrazione e PAR2 sono codice nativo nostro, quindi li facciamo gareggiare anche da soli contro il resto del campo su corpora identici. Un tempo conta solo quando l'output è byte-identico al payload sorgente.

Estrazione RAR · 8 forme di archivio

Contro unrar 7.23, 7-Zip, bsdtar, unar e il crate rars upstream su un Apple M3 Ultra, l'estrattore di nzbfast vince o pareggia ogni forma: 400 file piccoli in 0.13 s contro gli 0.66 s di unrar, solid 0.50 contro 0.87, cifrato 0.49 contro 0.82, un archivio RAR7 con dizionario da 128 MB 0.71 contro 0.92. Rieseguito su un M1 Ultra a 20 core e su un portatile Intel a 14 core, il risultato regge su ogni forma, e sul portatile i margini si allargano: i percorsi di decodifica paralleli scalano sui thread in più. Ogni tempo riportato ha prodotto output sha256-identico.

Verifica + riparazione PAR2 · set da 1 GiB

Contro il classico par2cmdline, il fork SIMD par2cmdline-turbo e MultiPar, nzbfast ha la verifica più veloce e la riparazione più veloce su ogni macchina testata. Desktop a 20 core: verifica pulita 0.40 s contro l'1.08 di turbo e il 3.67 del classico; riparazione di 101 blocchi danneggiati 1.26 s contro 2.61 e 7.52. Portatile a 14 core: verifica 1.26 contro 1.48, riparazione 2.57 contro 3.62. Ogni file riparato byte-identico. Una nota onesta: non creiamo PAR2 (a un downloader non serve, e quella prova appartiene a ParPar).

Quanto costa un lavoro

Picco di disco per un payload da 1.5 GB

La promessa della passata unica riguarda il disco quanto la velocità, quindi eccola misurata invece che affermata: il massimo raggiunto dalla directory di lavoro durante le esecuzioni annidate, campionato due volte al secondo. Leggerlo una volta sola alla fine non direbbe nulla, perché un client che cancella i volumi dopo l’estrazione sembrerebbe non averli mai scritti.

formanzbfastNZBGet 26.2rustnzb 1.3.4SABnzbd 5.0.4
RAR store dentro RAR store1538153817743080
livello interno compresso1536153616743102
RAR dentro RAR, profondità 21536153617143076
7z avvolto in un RAR store1503153617223102

Megabyte, meno è meglio. NZBGet ci eguaglia qui ed è giusto dire perché: gira con DirectUnpack e DirectWrite attivi, come configuriamo ogni concorrente, e su queste forme basta per tenere una sola copia su disco. SABnzbd ne tiene due. Il divario che resta è quello per cui la pipeline è stata costruita: non materializziamo mai i volumi, quindi il picco è il payload stesso e non il payload più l’archivio che lo trasportava.

Capacità, non micro-benchmark

Cosa può fare ogni client

nzbfastSABnzbd 5NZBGet 26rustnzbUsenappNewsbin
NNTP in pipelineoff di defaultno--
verifica completa durante il downloadogni bloccodopoquick-checkdopodopodopo
estrazione durante il downloadnel flusso, nessun volume su discodirect unpack⁴direct unpack⁴inaffidabile⁵nono
disco necessario per un post da N GB~1×N~2×N~2×N~2×N~2×N~2×N
verdetto di completabilità pre-downloadesatto al blocconosalute %nocontrollo articolino
memoria limitata (mai swap)a budget9.3 GB @ 190 GBimpostazione cacheno--
controlla il file in qualsiasi punto durante il downloadnononosequenzialeno
indexer integrato + bacheca dei postersì, senza chiavenononoUI di ricercabrowser dei gruppi
drop-in Sonarr/RadarrAPI SAB + Newznabnativonativoparzialenono
telecomandi per telefono (nzb360/LunaSea)via RPC NZBGetnonono
prelievo automatico watchlist + upgradeintegratovia *arrvia *arrnoWatchdogregole
singolo binario autonomoPython.app.exe
open sourceGPL⁶GPLGPLa pagamentoa pagamento
piattaformemac/win/linux/dockermac/win/linuxmac/win/linuxlinux/winsolo macsolo win

⁴ Il direct unpack materializza comunque prima i volumi: 2× scritture e 2× disco. ⁵ rustnzb ha consegnato volumi offuscati segnati come «Completato» nel nostro giro (la sua estrazione inoltre si blocca con l'unrar di RARLab se non disattivata). ⁶ GPL-3.0-or-later. Usenapp/Newsbin sono lettori commerciali a piattaforma singola con funzioni di download; sono elencati perché la gente lo chiede, non perché competono sulla velocità.

Prova di trasporto

Il motore satura linee reali

Regola fissa: ogni affermazione sulle prestazioni cita le condizioni in cui è stata eseguita, risultati negativi e strade sbagliate compresi.