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é.
Comparaison directe sur les opérations FIX fondamentales.
Comment passer de 730ns à 246ns en quatre phases cumulatives.
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.
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.
Le scan vectorisé AVX2 des délimiteurs SOH traite 32 octets par cycle. ~13x plus rapide que le scan octet par octet.
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.
Traitement d\'un message NewOrderSingle sur le chemin critique.
Décisions de conception qui se cumulent pour atteindre 3x de performance.
| Technique | QuickFIX | NexusFIX |
|---|---|---|
| Mémoire | Allocation heap par message | Vues std::span zéro-copie |
| Recherche de champ | O(log n) std::map | O(1) indexation directe du tableau |
| Parsing | Scan octet par octet | AVX2 SIMD vectorisé |
| Décalages de champs | Calcul à l\'exécution | consteval à la compilation |
| Conversion enum | Switch à l\'exécution (~300 branches) | 22 tables de correspondance à la compilation |
| Gestion des erreurs | Exceptions | std::expected (sans throw) |
11 bibliothèques de référence étudiées. Ce que nous avons appris, construit et mesuré.
La recherche itérateur O(n) est sous-optimale pour les paquets FIX denses
Décalages consteval + indexation directe O(1)
Swiss Tables avec sondage SIMD et empreintes H2
absl::flat_hash_map pour le stockage de session
File SPSC lock-free avec formatage différé
Quill comme backend de journalisation
Encodage binaire + thread d\'arrière-plan pour journalisation à 7ns
DeferredProcessor<T> avec sérialisation binaire statique
DEFER_TASKRUN élimine les réveils de tâches kernel
io_uring + tampons enregistrés + multishot
Abstraction SIMD portable entre jeux d\'instructions
Conservation d\'intrinsèques manuels pour les patterns FIX
Réacteur share-nothing pour I/O haute concurrence
Épinglage de cœur + pipelining lock-free
Barrières mémoire avancées et primitives lock-free
File SPSC native + validation par masquage de bits
Le rembourrage de ligne de cache élimine le faux partage
SPSCQueue native avec des techniques identiques
Wrappers SIMD génériques pour les opérations mathématiques
Intrinsèques Intel directs pour le scan SOH
Le tampon monotone permet l\'allocation d\'arène par message
std::pmr::monotonic_buffer_resource
Trois commandes pour compiler et exécuter les benchmarks vous-même.
$ 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