← NexusFIX/Benchmarks
Benchmarks · v1.8 · mayo de 2026

Benchmarks de
rendimiento.

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

Parsing de ExecutionReport
246 ns
QuickFIX 730 ns3,0x más rápido
Rendimiento
4,17M msg/seg
QuickFIX 1,19M msg/seg3,5x mayor
Latencia P99
258 ns
QuickFIX 784 ns3,0x menor
Asignaciones en heap / mensaje
0
QuickFIX ~12 (std::string, nodos std::map)reutilización de arena

NexusFIX vs QuickFIX.

Comparación directa en las operaciones FIX fundamentales.

Métrica
QuickFIX
NexusFIX
Mejora
Parsing de ExecutionReport
730 ns
246 ns
3,0x más rápido
Parsing de NewOrderSingle
661 ns
229 ns
2,9x más rápido
Acceso a campos (4 campos)
31 ns
11 ns
2,9x más rápido
Rendimiento
1,19M msg/seg
4,17M msg/seg
3,5x mayor
Latencia P99
784 ns
258 ns
3,0x menor

Proceso de optimización.

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

200 ns400 ns600 ns730 nslínea baseLÍNEA BASE520 ns−210FASE 1380 ns−140FASE 2290 ns−90FASE 3246 ns−44FASE 4TOTAL · -484NS · 3.0× MÁS RÁPIDO
1 Fase 1: Parsing sin copia
730ns → 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.

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

3 Fase 3: Exploración de delimitadores SIMD
380ns → 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.

4 Fase 4: Offsets en tiempo de compilación
290ns → 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.

QuickFIX /order-flow ruta crítica
~12 asignaciones de heap
Asignaciones en heap
~12 (std::string, nodos std::map)
Almacenamiento de campos
Copias std::map<int, std::string>
Lógica de parsing
Inserción en mapa en tiempo de ejecución
Huella de memoria
Dinámica, impredecible
Sobrecarga de destructor
~12 destructores std::string
HEAP · por mensaje12 asignaciones
0x7f3a..0000disperso
NexusFIX /order-flow ruta crítica
0 asignaciones · reutilización de arena
Asignaciones en heap
0
Almacenamiento de campos
Vistas std::span sobre el buffer original
Lógica de parsing
Tabla de offsets en tiempo de compilación
Huella de memoria
Estática, pool PMR preasignado
Sobrecarga de destructor
0 (sin memoria propia)
ARENA · por mensaje0 asignaciones
0x0001..a000contiguo · reutilizado

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.

hffix
Lo que aprendimos

La búsqueda O(n) con iterador es subóptima para paquetes FIX densos

Lo que construimos

Offsets de campo consteval + indexación directa O(1)

Acceso a campo en 14ns
Resultado
Abseil
Lo que aprendimos

Swiss Tables con sondeo SIMD y huellas H2

Lo que construimos

absl::flat_hash_map para el almacén de sesiones

Búsquedas un 31% más rápidas
Resultado
Quill
Lo que aprendimos

Cola SPSC sin bloqueo con formateo diferido

Lo que construimos

Quill como backend de logging

Latencia de log mediana de 8ns
Resultado
NanoLog
Lo que aprendimos

Codificación binaria + hilo en segundo plano para logging de 7ns

Lo que construimos

DeferredProcessor<T> con serialización binaria estática

Reducción del 84% (75→12ns)
Resultado
liburing
Lo que aprendimos

DEFER_TASKRUN elimina las activaciones de tareas del kernel

Lo que construimos

io_uring + buffers registrados + multishot

I/O un 7-27% más rápido
Resultado
Highway
Lo que aprendimos

Abstracción SIMD portable entre conjuntos de instrucciones

Lo que construimos

Se mantuvieron intrínsecos ajustados a mano para patrones FIX

13x de rendimiento
Resultado
Seastar
Lo que aprendimos

Reactor share-nothing para I/O de alta concurrencia

Lo que construimos

Anclaje de núcleo + pipelining sin bloqueo

Mejora del 8% en P99
Resultado
Folly
Lo que aprendimos

Vallas de memoria avanzadas y primitivas sin bloqueo

Lo que construimos

Cola SPSC nativa + validación con bit-masking

Sin dependencia externa
Resultado
Rigtorp
Lo que aprendimos

El relleno de línea de caché elimina el false sharing

Lo que construimos

SPSCQueue nativa con técnicas idénticas

88M ops/seg, 11ns
Resultado
xsimd
Lo que aprendimos

Wrappers SIMD genéricos para operaciones matemáticas

Lo que construimos

Intrínsecos Intel directos para escaneo SOH

2x más rápido que los wrappers
Resultado
Boost.PMR
Lo que aprendimos

El buffer monotónico habilita la asignación en arena por mensaje

Lo que construimos

std::pmr::monotonic_buffer_resource

Cero asignaciones en heap
Resultado

¿Listo para probar NexusFIX?

Tres comandos para compilar y ejecutar los benchmarks usted mismo.

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