
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.
| 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 |
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.
| Operação | QuickFIX | NexusFIX |
|---|---|---|
| Alocações de heap | ~12 (std::string, nós std::map) | 0 |
| Armazenamento de campos | Cópias std::map<int, std::string> | Vistas std::span no buffer original |
| Lógica de parsing | Inserção em map em tempo de execução | Tabela de offset em tempo de compilação |
| Footprint de memória | Dinâmico, imprevisível | Estático, pool PMR pré-alocado |
| Sobrecarga de destrutor | ~12 destrutores std::string | 0 (sem memória própria) |
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.
| Biblioteca | O que aprendemos | O que construímos | Resultado |
|---|---|---|---|
| hffix | A pesquisa O(n) por iterador é subótima para pacotes FIX densos | Offsets consteval + indexação O(1) direta | Acesso a campos em 14ns |
| Abseil | Swiss Tables com sondagem SIMD e fingerprints H2 | absl::flat_hash_map para armazenamento de sessão | 31% de lookups mais rápidos |
| Quill | Fila SPSC lock-free com formatação diferida | Quill como backend de logging | Latência mediana de log de 8ns |
| NanoLog | Codificação binária + thread de fundo para logging de 7ns | DeferredProcessor<T> com serialização binária estática | Redução de 84% (75→12ns) |
| liburing | DEFER_TASKRUN elimina wakeups de tarefas do kernel | io_uring + buffers registados + multishot | I/O 7-27% mais rápido |
| Highway | Abstração SIMD portátil entre conjuntos de instruções | Mantivemos intrínsecos ajustados manualmente para padrões FIX | Throughput 13x |
| Seastar | Reator share-nothing para I/O de alta concorrência | Core-pinning + pipelining lock-free | Melhoria de 8% no P99 |
| Folly | Fencing de memória avançada e primitivas lock-free | Fila SPSC nativa + validação por bit-masking | Zero dependência |
| Rigtorp | Preenchimento de cache-line elimina falso compartilhamento | SPSCQueue nativa com técnicas idênticas | 88M ops/seg, 11ns |
| xsimd | Wrappers SIMD genéricos para operações matemáticas | Intrínsecos Intel diretos para scanning SOH | 2x mais rápido do que wrappers |
| Boost.PMR | Buffer monotónico permite alocação em arena por mensagem | std::pmr::monotonic_buffer_resource | Zero alocação de heap |
Três comandos para compilar e executar os benchmarks você mesmo.
git clone https://github.com/StratCraft/NexusFIX.git\ncd NexusFIX\n./start.sh build