Resultados medidos, não declarações de marketing. Todos os benchmarks executados no Linux com GCC 13.3, 100.000 iterações, CPU fixada.
Comparação direta nas operações FIX principais.
Como passámos de 730ns para 246ns em quatro fases compostas.
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.
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.
O scanning vetorizado AVX2 de delimitadores SOH processa 32 bytes por ciclo. ~13x mais rápido do que o scanning byte a byte.
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.
Processamento de uma mensagem NewOrderSingle no hot path.
Decisões de design que se compõem para um desempenho 3x.
| Técnica | QuickFIX | NexusFIX |
|---|---|---|
| Memória | Alocação de heap por mensagem | Vistas std::span sem cópia |
| Acesso a campos | O(log n) std::map | O(1) indexação direta de array |
| Parsing | Scanning byte a byte | AVX2 SIMD vetorizado |
| Offsets de campos | Cálculo em tempo de execução | consteval em tempo de compilação |
| Conversão de enum | Switch em tempo de execução (~300 ramos) | 22 tabelas de lookup em tempo de compilação |
| Tratamento de erros | Exceções | std::expected (sem throw) |
11 bibliotecas líderes da indústria estudadas. O que aprendemos, o que construímos, o que medimos.
A pesquisa O(n) por iterador é subótima para pacotes FIX densos
Offsets consteval + indexação O(1) direta
Swiss Tables com sondagem SIMD e fingerprints H2
absl::flat_hash_map para armazenamento de sessão
Fila SPSC lock-free com formatação diferida
Quill como backend de logging
Codificação binária + thread de fundo para logging de 7ns
DeferredProcessor<T> com serialização binária estática
DEFER_TASKRUN elimina wakeups de tarefas do kernel
io_uring + buffers registados + multishot
Abstração SIMD portátil entre conjuntos de instruções
Mantivemos intrínsecos ajustados manualmente para padrões FIX
Reator share-nothing para I/O de alta concorrência
Core-pinning + pipelining lock-free
Fencing de memória avançada e primitivas lock-free
Fila SPSC nativa + validação por bit-masking
Preenchimento de cache-line elimina falso compartilhamento
SPSCQueue nativa com técnicas idênticas
Wrappers SIMD genéricos para operações matemáticas
Intrínsecos Intel diretos para scanning SOH
Buffer monotónico permite alocação em arena por mensagem
std::pmr::monotonic_buffer_resource
Três comandos para compilar e executar os benchmarks você mesmo.
$ 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