StratCraft

Benchmarks de rendimiento

Resultados medidos, no afirmaciones de marketing. Todos los benchmarks ejecutados en Linux con GCC 13.3, 100 000 iteraciones, CPU anclada.

NexusFIX vs QuickFIX

Comparación directa en las operaciones FIX fundamentales.

MétricaQuickFIXNexusFIXMejora
Parsing de ExecutionReport730 ns246 ns3,0x más rápido
Parsing de NewOrderSingle661 ns229 ns2,9x más rápido
Acceso a campos (4 campos)31 ns11 ns2,9x más rápido
Rendimiento1,19M msg/seg4,17M msg/seg3,5x mayor
Latencia P99784 ns258 ns3,0x menor

Proceso de optimización

Cómo pasamos de 730ns a 246ns en cuatro fases acumulativas.

Fase 1: Parsing sin copia730ns → 520ns

Sustituir copias de std::string por vistas std::span<const char> sobre el buffer original. Un std::span ocupa 16 bytes en la pila — sin heap, sin copia, sin destructor.

Fase 2: Búsqueda de campo O(1)520ns → 380ns

Sustituir std::map<int, std::string> por un array pre-indexado. El acceso a campos se convierte en una sola instrucción mov indexada por número de tag FIX.

Fase 3: Exploración de delimitadores SIMD380ns → 290ns

Exploración vectorizada AVX2 de delimitadores SOH que procesa 32 bytes por ciclo. ~13x más rápido que el escaneo byte a byte.

Fase 4: Offsets en tiempo de compilación290ns → 246ns

Tablas de offsets de campos consteval y 22 tablas de búsqueda en tiempo de compilación eliminan ~300 ramas en tiempo de ejecución para conversión de enums/tipos.

Prueba de cero asignaciones

Procesando un mensaje NewOrderSingle en la ruta crítica.

OperaciónQuickFIXNexusFIX
Asignaciones en heap~12 (std::string, nodos std::map)0
Almacenamiento de camposCopias std::map<int, std::string>Vistas std::span sobre el buffer original
Lógica de parsingInserción en mapa en tiempo de ejecuciónTabla de offsets en tiempo de compilación
Huella de memoriaDinámica, impredecibleEstática, pool PMR preasignado
Sobrecarga de destructor~12 destructores std::string0 (sin memoria propia)

Comparación de técnicas

Decisiones de diseño que se acumulan para dar 3x de rendimiento.

TécnicaQuickFIXNexusFIX
MemoriaAsignación en heap por mensajeVistas std::span de copia cero
Búsqueda de campoO(log n) std::mapO(1) indexación directa de array
ParsingEscaneo byte a byteVectorizado AVX2 SIMD
Offsets de campoCálculo en tiempo de ejecuciónconsteval en tiempo de compilación
Conversión de enumsswitch en tiempo de ejecución (~300 ramas)22 tablas de búsqueda en tiempo de compilación
Manejo de erroresExcepcionesstd::expected (sin lanzamiento)

Influencias de arquitectura

11 librerías líderes del sector estudiadas. Lo que aprendimos, lo que construimos, lo que medimos.

LibreríaLo que aprendimosLo que construimosResultado
hffixLa búsqueda O(n) con iterador es subóptima para paquetes FIX densosOffsets de campo consteval + indexación directa O(1)Acceso a campo en 14ns
AbseilSwiss Tables con sondeo SIMD y huellas H2absl::flat_hash_map para el almacén de sesionesBúsquedas un 31% más rápidas
QuillCola SPSC sin bloqueo con formateo diferidoQuill como backend de loggingLatencia de log mediana de 8ns
NanoLogCodificación binaria + hilo en segundo plano para logging de 7nsDeferredProcessor<T> con serialización binaria estáticaReducción del 84% (75→12ns)
liburingDEFER_TASKRUN elimina las activaciones de tareas del kernelio_uring + buffers registrados + multishotI/O un 7-27% más rápido
HighwayAbstracción SIMD portable entre conjuntos de instruccionesSe mantuvieron intrínsecos ajustados a mano para patrones FIX13x de rendimiento
SeastarReactor share-nothing para I/O de alta concurrenciaAnclaje de núcleo + pipelining sin bloqueoMejora del 8% en P99
FollyVallas de memoria avanzadas y primitivas sin bloqueoCola SPSC nativa + validación con bit-maskingSin dependencia externa
RigtorpEl relleno de línea de caché elimina el false sharingSPSCQueue nativa con técnicas idénticas88M ops/seg, 11ns
xsimdWrappers SIMD genéricos para operaciones matemáticasIntrínsecos Intel directos para escaneo SOH2x más rápido que los wrappers
Boost.PMREl buffer monotónico habilita la asignación en arena por mensajestd::pmr::monotonic_buffer_resourceCero asignaciones en heap

¿Listo para probar NexusFIX?

Tres comandos para compilar y ejecutar los benchmarks usted mismo.

git clone https://github.com/StratCraft/NexusFIX.git\ncd NexusFIX\n./start.sh build