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

Benchmarks de
Desempenho.

Resultados medidos, não declarações de marketing. Todos os benchmarks executados no Linux com GCC 13.3, 100.000 iterações, CPU fixada.

Parse de ExecutionReport
246 ns
QuickFIX 730 ns3,0x mais rápido
Throughput
4,17M msg/seg
QuickFIX 1,19M msg/seg3,5x maior
Latência P99
258 ns
QuickFIX 784 ns3,0x menor
Alocações de heap / mensagem
0
QuickFIX ~12 (std::string, nós std::map)reuso de arena

NexusFIX vs QuickFIX.

Comparação direta nas operações FIX principais.

Métrica
QuickFIX
NexusFIX
Melhoria
Parse de ExecutionReport
730 ns
246 ns
3,0x mais rápido
Parse de NewOrderSingle
661 ns
229 ns
2,9x mais rápido
Acesso a campos (4 campos)
31 ns
11 ns
2,9x mais rápido
Throughput
1,19M msg/seg
4,17M msg/seg
3,5x maior
Latência P99
784 ns
258 ns
3,0x menor

Percurso de otimização.

Como passámos de 730ns para 246ns em quatro fases compostas.

200 ns400 ns600 ns730 nslinha baseLINHA BASE520 ns−210FASE 1380 ns−140FASE 2290 ns−90FASE 3246 ns−44FASE 4TOTAL · -484NS · 3.0× MAIS RÁPIDO
1 Fase 1: Parsing sem cópia
730ns → 520ns

Substituir cópias de std::string por vistas std::span<const char> no buffer original. Um std::span tem 16 bytes na pilha. Sem heap, sem cópia, sem destrutor.

2 Fase 2: Acesso a campos O(1)
520ns → 380ns

Substituir std::map<int, std::string> por um array pré-indexado. O acesso a campos torna-se uma única instrução mov indexada pelo número de tag FIX.

3 Fase 3: Scanning de delimitadores SIMD
380ns → 290ns

O scanning vetorizado AVX2 de delimitadores SOH processa 32 bytes por ciclo. ~13x mais rápido do que o scanning byte a byte.

4 Fase 4: Offsets em tempo de compilação
290ns → 246ns

Tabelas de offset consteval e 22 tabelas de lookup em tempo de compilação eliminam ~300 ramos em tempo de execução para conversão enum/tipo.

Prova de alocação zero.

Processamento de uma mensagem NewOrderSingle no hot path.

QuickFIX /order-flow caminho crítico
~12 alocações de heap
Alocações de heap
~12 (std::string, nós std::map)
Armazenamento de campos
Cópias std::map<int, std::string>
Lógica de parsing
Inserção em map em tempo de execução
Footprint de memória
Dinâmico, imprevisível
Sobrecarga de destrutor
~12 destrutores std::string
HEAP · por mensagem12 alocações
0x7f3a..0000disperso
NexusFIX /order-flow caminho crítico
0 alocações · reuso de arena
Alocações de heap
0
Armazenamento de campos
Vistas std::span no buffer original
Lógica de parsing
Tabela de offset em tempo de compilação
Footprint de memória
Estático, pool PMR pré-alocado
Sobrecarga de destrutor
0 (sem memória própria)
ARENA · por mensagem0 alocações
0x0001..a000contíguo · reutilizado

Comparação de técnicas.

Decisões de design que se compõem para um desempenho 3x.

TécnicaQuickFIXNexusFIX
MemóriaAlocação de heap por mensagemVistas std::span sem cópia
Acesso a camposO(log n) std::mapO(1) indexação direta de array
ParsingScanning byte a byteAVX2 SIMD vetorizado
Offsets de camposCálculo em tempo de execuçãoconsteval em tempo de compilação
Conversão de enumSwitch em tempo de execução (~300 ramos)22 tabelas de lookup em tempo de compilação
Tratamento de errosExceçõesstd::expected (sem throw)

Influências arquitetónicas.

11 bibliotecas líderes da indústria estudadas. O que aprendemos, o que construímos, o que medimos.

hffix
O que aprendemos

A pesquisa O(n) por iterador é subótima para pacotes FIX densos

O que construímos

Offsets consteval + indexação O(1) direta

Acesso a campos em 14ns
Resultado
Abseil
O que aprendemos

Swiss Tables com sondagem SIMD e fingerprints H2

O que construímos

absl::flat_hash_map para armazenamento de sessão

31% de lookups mais rápidos
Resultado
Quill
O que aprendemos

Fila SPSC lock-free com formatação diferida

O que construímos

Quill como backend de logging

Latência mediana de log de 8ns
Resultado
NanoLog
O que aprendemos

Codificação binária + thread de fundo para logging de 7ns

O que construímos

DeferredProcessor<T> com serialização binária estática

Redução de 84% (75→12ns)
Resultado
liburing
O que aprendemos

DEFER_TASKRUN elimina wakeups de tarefas do kernel

O que construímos

io_uring + buffers registados + multishot

I/O 7-27% mais rápido
Resultado
Highway
O que aprendemos

Abstração SIMD portátil entre conjuntos de instruções

O que construímos

Mantivemos intrínsecos ajustados manualmente para padrões FIX

Throughput 13x
Resultado
Seastar
O que aprendemos

Reator share-nothing para I/O de alta concorrência

O que construímos

Core-pinning + pipelining lock-free

Melhoria de 8% no P99
Resultado
Folly
O que aprendemos

Fencing de memória avançada e primitivas lock-free

O que construímos

Fila SPSC nativa + validação por bit-masking

Zero dependência
Resultado
Rigtorp
O que aprendemos

Preenchimento de cache-line elimina falso compartilhamento

O que construímos

SPSCQueue nativa com técnicas idênticas

88M ops/seg, 11ns
Resultado
xsimd
O que aprendemos

Wrappers SIMD genéricos para operações matemáticas

O que construímos

Intrínsecos Intel diretos para scanning SOH

2x mais rápido do que wrappers
Resultado
Boost.PMR
O que aprendemos

Buffer monotónico permite alocação em arena por mensagem

O que construímos

std::pmr::monotonic_buffer_resource

Zero alocação de heap
Resultado

Pronto para experimentar o NexusFIX?

Três comandos para compilar e executar os benchmarks você mesmo.

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