
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.
| 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 |
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.
| Opération | QuickFIX | NexusFIX |
|---|---|---|
| Allocations heap | ~12 (std::string, nœuds std::map) | 0 |
| Stockage des champs | Copies std::map<int, std::string> | Vues std::span dans le tampon d\'origine |
| Logique de parsing | Insertion dans map à l\'exécution | Table de décalages à la compilation |
| Empreinte mémoire | Dynamique, imprévisible | Statique, pool PMR pré-alloué |
| Surcharge des destructeurs | ~12 destructeurs std::string | 0 (pas de mémoire possédée) |
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é.
| Bibliothèque | Ce que nous avons appris | Ce que nous avons construit | Résultat |
|---|---|---|---|
| hffix | La recherche itérateur O(n) est sous-optimale pour les paquets FIX denses | Décalages consteval + indexation directe O(1) | Accès champ en 14ns |
| Abseil | Swiss Tables avec sondage SIMD et empreintes H2 | absl::flat_hash_map pour le stockage de session | Lookups 31% plus rapides |
| Quill | File SPSC lock-free avec formatage différé | Quill comme backend de journalisation | Latence médiane de journalisation de 8ns |
| NanoLog | Encodage binaire + thread d\'arrière-plan pour journalisation à 7ns | DeferredProcessor<T> avec sérialisation binaire statique | Réduction de 84% (75→12ns) |
| liburing | DEFER_TASKRUN élimine les réveils de tâches kernel | io_uring + tampons enregistrés + multishot | I/O 7-27% plus rapide |
| Highway | Abstraction SIMD portable entre jeux d\'instructions | Conservation d\'intrinsèques manuels pour les patterns FIX | Débit 13x |
| Seastar | Réacteur share-nothing pour I/O haute concurrence | Épinglage de cœur + pipelining lock-free | Amélioration P99 de 8% |
| Folly | Barrières mémoire avancées et primitives lock-free | File SPSC native + validation par masquage de bits | Zéro dépendance |
| Rigtorp | Le rembourrage de ligne de cache élimine le faux partage | SPSCQueue native avec des techniques identiques | 88M ops/sec, 11ns |
| xsimd | Wrappers SIMD génériques pour les opérations mathématiques | Intrinsèques Intel directs pour le scan SOH | 2x plus rapide que les wrappers |
| Boost.PMR | Le tampon monotone permet l\'allocation d\'arène par message | std::pmr::monotonic_buffer_resource | Zéro allocation heap |
Trois commandes pour compiler et exécuter les benchmarks vous-même.
git clone https://github.com/StratCraft/NexusFIX.git\ncd NexusFIX\n./start.sh build