← NexusFIX/Benchmarks
Benchmarks · v1.8 · mai 2026

Benchmarks de
performance.

Résultats mesurés, pas de promesses marketing. Tous les benchmarks exécutés sur Linux avec GCC 13.3, 100 000 itérations, CPU épinglé.

Parsing ExecutionReport
246 ns
QuickFIX 730 ns3,0x plus rapide
Débit
4,17M msg/sec
QuickFIX 1,19M msg/sec3,5x plus élevé
Latence P99
258 ns
QuickFIX 784 ns3,0x plus faible
Allocations heap / message
0
QuickFIX ~12 (std::string, nœuds std::map)réutilisation de l'arène

NexusFIX vs QuickFIX.

Comparaison directe sur les opérations FIX fondamentales.

Métrique
QuickFIX
NexusFIX
Amélioration
Parsing ExecutionReport
730 ns
246 ns
3,0x plus rapide
Parsing NewOrderSingle
661 ns
229 ns
2,9x plus rapide
Accès aux champs (4 champs)
31 ns
11 ns
2,9x plus rapide
Débit
1,19M msg/sec
4,17M msg/sec
3,5x plus élevé
Latence P99
784 ns
258 ns
3,0x plus faible

Parcours d\'optimisation.

Comment passer de 730ns à 246ns en quatre phases cumulatives.

200 ns400 ns600 ns730 nsréférenceRÉFÉRENCE520 ns−210PHASE 1380 ns−140PHASE 2290 ns−90PHASE 3246 ns−44PHASE 4TOTAL · -484NS · 3.0× PLUS RAPIDE
1 Phase 1 : Parsing zéro-copie
730ns → 520ns

Remplacer les copies std::string par des vues std::span<const char> dans le tampon d\'origine. Un std::span occupe 16 octets sur la pile. Pas de heap, pas de copie, pas de destructeur.

2 Phase 2 : Recherche de champ O(1)
520ns → 380ns

Remplacer std::map<int, std::string> par un tableau pré-indexé. L\'accès aux champs devient une seule instruction mov indexée par le numéro de tag FIX.

3 Phase 3 : Scan de délimiteurs SIMD
380ns → 290ns

Le scan vectorisé AVX2 des délimiteurs SOH traite 32 octets par cycle. ~13x plus rapide que le scan octet par octet.

4 Phase 4 : Décalages à la compilation
290ns → 246ns

Les tables de décalage de champs consteval et 22 tables de correspondance à la compilation éliminent ~300 branches d\'exécution pour la conversion enum/type.

Preuve d\'allocation zéro.

Traitement d\'un message NewOrderSingle sur le chemin critique.

QuickFIX /order-flow chemin critique
~12 allocations heap
Allocations heap
~12 (std::string, nœuds std::map)
Stockage des champs
Copies std::map<int, std::string>
Logique de parsing
Insertion dans map à l\'exécution
Empreinte mémoire
Dynamique, imprévisible
Surcharge des destructeurs
~12 destructeurs std::string
HEAP · par message12 allocations
0x7f3a..0000dispersé
NexusFIX /order-flow chemin critique
0 allocation · réutilisation d'arène
Allocations heap
0
Stockage des champs
Vues std::span dans le tampon d\'origine
Logique de parsing
Table de décalages à la compilation
Empreinte mémoire
Statique, pool PMR pré-alloué
Surcharge des destructeurs
0 (pas de mémoire possédée)
ARENA · par message0 allocation
0x0001..a000contigu · réutilisé

Comparaison des techniques.

Décisions de conception qui se cumulent pour atteindre 3x de performance.

TechniqueQuickFIXNexusFIX
MémoireAllocation heap par messageVues std::span zéro-copie
Recherche de champO(log n) std::mapO(1) indexation directe du tableau
ParsingScan octet par octetAVX2 SIMD vectorisé
Décalages de champsCalcul à l\'exécutionconsteval à la compilation
Conversion enumSwitch à l\'exécution (~300 branches)22 tables de correspondance à la compilation
Gestion des erreursExceptionsstd::expected (sans throw)

Influences architecturales.

11 bibliothèques de référence étudiées. Ce que nous avons appris, construit et mesuré.

hffix
Ce que nous avons appris

La recherche itérateur O(n) est sous-optimale pour les paquets FIX denses

Ce que nous avons construit

Décalages consteval + indexation directe O(1)

Accès champ en 14ns
Résultat
Abseil
Ce que nous avons appris

Swiss Tables avec sondage SIMD et empreintes H2

Ce que nous avons construit

absl::flat_hash_map pour le stockage de session

Lookups 31% plus rapides
Résultat
Quill
Ce que nous avons appris

File SPSC lock-free avec formatage différé

Ce que nous avons construit

Quill comme backend de journalisation

Latence médiane de journalisation de 8ns
Résultat
NanoLog
Ce que nous avons appris

Encodage binaire + thread d\'arrière-plan pour journalisation à 7ns

Ce que nous avons construit

DeferredProcessor<T> avec sérialisation binaire statique

Réduction de 84% (75→12ns)
Résultat
liburing
Ce que nous avons appris

DEFER_TASKRUN élimine les réveils de tâches kernel

Ce que nous avons construit

io_uring + tampons enregistrés + multishot

I/O 7-27% plus rapide
Résultat
Highway
Ce que nous avons appris

Abstraction SIMD portable entre jeux d\'instructions

Ce que nous avons construit

Conservation d\'intrinsèques manuels pour les patterns FIX

Débit 13x
Résultat
Seastar
Ce que nous avons appris

Réacteur share-nothing pour I/O haute concurrence

Ce que nous avons construit

Épinglage de cœur + pipelining lock-free

Amélioration P99 de 8%
Résultat
Folly
Ce que nous avons appris

Barrières mémoire avancées et primitives lock-free

Ce que nous avons construit

File SPSC native + validation par masquage de bits

Zéro dépendance
Résultat
Rigtorp
Ce que nous avons appris

Le rembourrage de ligne de cache élimine le faux partage

Ce que nous avons construit

SPSCQueue native avec des techniques identiques

88M ops/sec, 11ns
Résultat
xsimd
Ce que nous avons appris

Wrappers SIMD génériques pour les opérations mathématiques

Ce que nous avons construit

Intrinsèques Intel directs pour le scan SOH

2x plus rapide que les wrappers
Résultat
Boost.PMR
Ce que nous avons appris

Le tampon monotone permet l\'allocation d\'arène par message

Ce que nous avons construit

std::pmr::monotonic_buffer_resource

Zéro allocation heap
Résultat

Prêt à essayer NexusFIX ?

Trois commandes pour compiler et exécuter les benchmarks vous-même.

~/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