Risultati misurati, non promesse di marketing. Tutti i benchmark eseguiti su Linux con GCC 13.3, 100.000 iterazioni, CPU pinnata.
Confronto diretto sulle operazioni FIX principali.
Come siamo passati da 730ns a 246ns in quattro fasi cumulative.
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.
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.
La scansione vettorizzata AVX2 dei delimitatori SOH elabora 32 byte per ciclo. ~13x più veloce della scansione byte per byte.
Tabelle di offset campi consteval e 22 tabelle di lookup a compile-time eliminano ~300 rami di runtime per la conversione enum/tipo.
Elaborazione di un messaggio NewOrderSingle sul percorso critico.
Scelte di progettazione che si sommano per ottenere 3x di prestazioni.
| Tecnica | QuickFIX | NexusFIX |
|---|---|---|
| Memoria | Allocazione heap per messaggio | Viste std::span zero-copy |
| Lookup campi | O(log n) std::map | O(1) indicizzazione diretta su array |
| Parsing | Scansione byte per byte | AVX2 SIMD vettorizzato |
| Offset campi | Calcolo a runtime | consteval a compile-time |
| Conversione enum | Switch a runtime (~300 rami) | 22 tabelle di lookup a compile-time |
| Gestione errori | Eccezioni | std::expected (nessun throw) |
11 librerie leader del settore studiate. Cosa abbiamo imparato, cosa abbiamo costruito, cosa abbiamo misurato.
Il lookup iteratore O(n) è subottimale per pacchetti FIX densi
Offset campi consteval + indicizzazione diretta O(1)
Swiss Tables con sondaggio SIMD e fingerprint H2
absl::flat_hash_map per lo store di sessione
Coda SPSC lock-free con formattazione differita
Quill come backend di logging
Codifica binaria + thread in background per logging a 7ns
DeferredProcessor<T> con serializzazione binaria statica
DEFER_TASKRUN elimina i wakeup del kernel
io_uring + buffer registrati + multishot
Astrazione SIMD portabile su set di istruzioni diversi
Mantenuti intrinsics calibrati manualmente per i pattern FIX
Reactor share-nothing per I/O ad alta concorrenza
Core-pinning + pipelining lock-free
Fencing avanzato della memoria e primitive lock-free
Coda SPSC nativa + validazione con bit-masking
Il padding cache-line elimina il false sharing
SPSCQueue nativa con tecniche identiche
Wrapper SIMD generici per operazioni matematiche
Intrinsics Intel diretti per la scansione SOH
Il buffer monotono abilita l\'allocazione arena per messaggio
std::pmr::monotonic_buffer_resource
Tre comandi per compilare ed eseguire i benchmark in autonomia.
$ 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