StratCraft

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é.

NexusFIX vs QuickFIX

Comparaison directe sur les opérations FIX fondamentales.

MétriqueQuickFIXNexusFIXAmélioration
Parsing ExecutionReport730 ns246 ns3,0x plus rapide
Parsing NewOrderSingle661 ns229 ns2,9x plus rapide
Accès aux champs (4 champs)31 ns11 ns2,9x plus rapide
Débit1,19M msg/sec4,17M msg/sec3,5x plus élevé
Latence P99784 ns258 ns3,0x plus faible

Parcours d\'optimisation

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

Phase 1 : Parsing zéro-copie730ns → 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.

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.

Phase 3 : Scan de délimiteurs SIMD380ns → 290ns

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

Phase 4 : Décalages à la compilation290ns → 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.

OpérationQuickFIXNexusFIX
Allocations heap~12 (std::string, nœuds std::map)0
Stockage des champsCopies std::map<int, std::string>Vues std::span dans le tampon d\'origine
Logique de parsingInsertion dans map à l\'exécutionTable de décalages à la compilation
Empreinte mémoireDynamique, imprévisibleStatique, pool PMR pré-alloué
Surcharge des destructeurs~12 destructeurs std::string0 (pas de mémoire possédée)

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é.

BibliothèqueCe que nous avons apprisCe que nous avons construitRésultat
hffixLa recherche itérateur O(n) est sous-optimale pour les paquets FIX densesDécalages consteval + indexation directe O(1)Accès champ en 14ns
AbseilSwiss Tables avec sondage SIMD et empreintes H2absl::flat_hash_map pour le stockage de sessionLookups 31% plus rapides
QuillFile SPSC lock-free avec formatage différéQuill comme backend de journalisationLatence médiane de journalisation de 8ns
NanoLogEncodage binaire + thread d\'arrière-plan pour journalisation à 7nsDeferredProcessor<T> avec sérialisation binaire statiqueRéduction de 84% (75→12ns)
liburingDEFER_TASKRUN élimine les réveils de tâches kernelio_uring + tampons enregistrés + multishotI/O 7-27% plus rapide
HighwayAbstraction SIMD portable entre jeux d\'instructionsConservation d\'intrinsèques manuels pour les patterns FIXDébit 13x
SeastarRéacteur share-nothing pour I/O haute concurrenceÉpinglage de cœur + pipelining lock-freeAmélioration P99 de 8%
FollyBarrières mémoire avancées et primitives lock-freeFile SPSC native + validation par masquage de bitsZéro dépendance
RigtorpLe rembourrage de ligne de cache élimine le faux partageSPSCQueue native avec des techniques identiques88M ops/sec, 11ns
xsimdWrappers SIMD génériques pour les opérations mathématiquesIntrinsèques Intel directs pour le scan SOH2x plus rapide que les wrappers
Boost.PMRLe tampon monotone permet l\'allocation d\'arène par messagestd::pmr::monotonic_buffer_resourceZéro allocation heap

Prêt à essayer NexusFIX ?

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