← NexusFIX/Benchmark
Benchmark · v1.8 · maggio 2026

Benchmark di
prestazione.

Risultati misurati, non promesse di marketing. Tutti i benchmark eseguiti su Linux con GCC 13.3, 100.000 iterazioni, CPU pinnata.

Parse ExecutionReport
246 ns
QuickFIX 730 ns3,0x più veloce
Throughput
4,17M msg/sec
QuickFIX 1,19M msg/sec3,5x superiore
Latenza P99
258 ns
QuickFIX 784 ns3,0x inferiore
Allocazioni heap / messaggio
0
QuickFIX ~12 (std::string, nodi std::map)riuso arena

NexusFIX vs QuickFIX.

Confronto diretto sulle operazioni FIX principali.

Metrica
QuickFIX
NexusFIX
Miglioramento
Parse ExecutionReport
730 ns
246 ns
3,0x più veloce
Parse NewOrderSingle
661 ns
229 ns
2,9x più veloce
Accesso campi (4 campi)
31 ns
11 ns
2,9x più veloce
Throughput
1,19M msg/sec
4,17M msg/sec
3,5x superiore
Latenza P99
784 ns
258 ns
3,0x inferiore

Percorso di ottimizzazione.

Come siamo passati da 730ns a 246ns in quattro fasi cumulative.

200 ns400 ns600 ns730 nsbaselineBASELINE520 ns−210FASE 1380 ns−140FASE 2290 ns−90FASE 3246 ns−44FASE 4TOTALE · -484NS · 3.0× PIÙ VELOCE
1 Fase 1: Parsing Zero-Copy
730ns → 520ns

Sostituire le copie std::string con viste std::span<const char> nel buffer originale. Uno std::span è 16 byte nello stack. Nessun heap, nessuna copia, nessun distruttore.

2 Fase 2: Lookup campi O(1)
520ns → 380ns

Sostituire std::map<int, std::string> con un array pre-indicizzato. L\'accesso ai campi diventa una singola istruzione mov indicizzata dal numero di tag FIX.

3 Fase 3: Scansione delimitatori SIMD
380ns → 290ns

La scansione vettorizzata AVX2 dei delimitatori SOH elabora 32 byte per ciclo. ~13x più veloce della scansione byte per byte.

4 Fase 4: Offset a compile-time
290ns → 246ns

Tabelle di offset campi consteval e 22 tabelle di lookup a compile-time eliminano ~300 rami di runtime per la conversione enum/tipo.

Prova di zero allocazioni.

Elaborazione di un messaggio NewOrderSingle sul percorso critico.

QuickFIX /order-flow percorso critico
~12 allocazioni heap
Allocazioni heap
~12 (std::string, nodi std::map)
Archiviazione campi
Copie std::map<int, std::string>
Logica di parsing
Inserimento map a runtime
Impronta di memoria
Dinamica, imprevedibile
Overhead distruttore
~12 distruttori std::string
HEAP · per messaggio12 allocazioni
0x7f3a..0000sparso
NexusFIX /order-flow percorso critico
0 allocazioni · riuso arena
Allocazioni heap
0
Archiviazione campi
Viste std::span nel buffer originale
Logica di parsing
Tabella offset a compile-time
Impronta di memoria
Statica, pool PMR pre-allocato
Overhead distruttore
0 (nessuna memoria posseduta)
ARENA · per messaggio0 allocazioni
0x0001..a000contiguo · riutilizzato

Confronto tecnico.

Scelte di progettazione che si sommano per ottenere 3x di prestazioni.

TecnicaQuickFIXNexusFIX
MemoriaAllocazione heap per messaggioViste std::span zero-copy
Lookup campiO(log n) std::mapO(1) indicizzazione diretta su array
ParsingScansione byte per byteAVX2 SIMD vettorizzato
Offset campiCalcolo a runtimeconsteval a compile-time
Conversione enumSwitch a runtime (~300 rami)22 tabelle di lookup a compile-time
Gestione erroriEccezionistd::expected (nessun throw)

Influenze architetturali.

11 librerie leader del settore studiate. Cosa abbiamo imparato, cosa abbiamo costruito, cosa abbiamo misurato.

hffix
Cosa abbiamo imparato

Il lookup iteratore O(n) è subottimale per pacchetti FIX densi

Cosa abbiamo costruito

Offset campi consteval + indicizzazione diretta O(1)

Accesso campi in 14ns
Risultato
Abseil
Cosa abbiamo imparato

Swiss Tables con sondaggio SIMD e fingerprint H2

Cosa abbiamo costruito

absl::flat_hash_map per lo store di sessione

Lookup 31% più veloci
Risultato
Quill
Cosa abbiamo imparato

Coda SPSC lock-free con formattazione differita

Cosa abbiamo costruito

Quill come backend di logging

Latenza log mediana di 8ns
Risultato
NanoLog
Cosa abbiamo imparato

Codifica binaria + thread in background per logging a 7ns

Cosa abbiamo costruito

DeferredProcessor<T> con serializzazione binaria statica

Riduzione dell\'84% (75→12ns)
Risultato
liburing
Cosa abbiamo imparato

DEFER_TASKRUN elimina i wakeup del kernel

Cosa abbiamo costruito

io_uring + buffer registrati + multishot

I/O 7-27% più veloce
Risultato
Highway
Cosa abbiamo imparato

Astrazione SIMD portabile su set di istruzioni diversi

Cosa abbiamo costruito

Mantenuti intrinsics calibrati manualmente per i pattern FIX

13x di throughput
Risultato
Seastar
Cosa abbiamo imparato

Reactor share-nothing per I/O ad alta concorrenza

Cosa abbiamo costruito

Core-pinning + pipelining lock-free

Miglioramento P99 dell\'8%
Risultato
Folly
Cosa abbiamo imparato

Fencing avanzato della memoria e primitive lock-free

Cosa abbiamo costruito

Coda SPSC nativa + validazione con bit-masking

Zero dipendenze
Risultato
Rigtorp
Cosa abbiamo imparato

Il padding cache-line elimina il false sharing

Cosa abbiamo costruito

SPSCQueue nativa con tecniche identiche

88M ops/sec, 11ns
Risultato
xsimd
Cosa abbiamo imparato

Wrapper SIMD generici per operazioni matematiche

Cosa abbiamo costruito

Intrinsics Intel diretti per la scansione SOH

2x più veloce dei wrapper
Risultato
Boost.PMR
Cosa abbiamo imparato

Il buffer monotono abilita l\'allocazione arena per messaggio

Cosa abbiamo costruito

std::pmr::monotonic_buffer_resource

Zero allocazioni heap
Risultato

Pronto a provare NexusFIX?

Tre comandi per compilare ed eseguire i benchmark in autonomia.

~/dev. Bench
$ git clone https://github.com/StratCraftsAI/NexusFix.git
$ cd NexusFix
$ ./start.sh build # 2m18s · release
$ ./start.sh bench
  running 100,000 iterations · cpu pinned · warm cache
  ExecutionReport parse   246 ns   p99 258 ns
  NewOrderSingle parse    229 ns   p99 241 ns
  field_access            11 ns
  throughput              4.17 M msg/s
  ✓ csv written to ./out/bench-2026-05-17.csv