← NexusFIX/Benchmarks
Benchmarks · v1.8 · Май 2026

Оценки
производительности.

Измеренные результаты, а не маркетинговые заявления. Все тесты выполняются в Linux с GCC 13.3, 100 000 итераций, с привязкой к ЦП.

ExecutionReport Parse
246 нс
QuickFIX 730 нс3,0x быстрее
Пропускная способность
4,17M сообщений/сек
QuickFIX 1,19M сообщений/сек3,5x выше
P99 Задержка
На 258 нс
QuickFIX 784 нсв 3,0 раза меньше
Таблица смещений во время компиляции / сообщ.
0
QuickFIX Объём памятипереиспользование арены

NexusFIX и QuickFIX.

Непосредственное сравнение основных операций FIX.

Метрика
QuickFIX
NexusFIX
Improvement
ExecutionReport Parse
730 нс
246 нс
3,0x быстрее
NewOrderSingle Parse
661 нс
229 нс
2,9x быстрее
Доступ к полю (4 поля)
31 нс
11 нс
2.9x faster
Пропускная способность
1,19M сообщений/сек
4,17M сообщений/сек
3,5x выше
P99 Задержка
784 нс
На 258 нс
в 3,0 раза меньше

Путь оптимизации.

Как мы прошли путь от 730нс до 246нс за четыре этапа компаундирования.

200 ns400 ns600 ns730 nsбазоваяБАЗОВАЯ520 ns−210ЭТАП 1380 ns−140ЭТАП 2290 ns−90ЭТАП 3246 ns−44ЭТАП 4ИТОГО · -484НС · 3.0× БЫСТРЕЕ
1 Фаза 1: синтаксический анализ с нулевым копированием
730нс → 520нс

Замените копии std::string представлениями std::span<const char> в исходном буфере. Std::span занимает 16 байт в стеке. Без кучи, без копирования, без деструктора.

2 Фаза 2: O(1) Поиск поля
520ns → 380ns

Замените std::map<int, std::string> предварительно индексированным массивом. Доступ к полю становится одной командой перемещения, индексируемой номером тега FIX.

3 Фаза 3: сканирование разделителя SIMD
380 нс → 290 нс

Векторизованное сканирование разделителя SOH AVX2 обрабатывает 32 байта за цикл. ~ в 13 раз быстрее, чем побайтовое сканирование.

4 Фаза 4: смещения времени компиляции
290 нс → 246 нс

Таблицы смещения полей consteval и 22 таблицы поиска во время компиляции исключают ~300 ветвей времени выполнения для преобразования перечислений/типов. std::string> копирует

std::span просматривает в исходный буфер.

Логика синтаксического анализа

QuickFIX /order-flow горячий путь
~12 выделений в куче
Таблица смещений во время компиляции
Объём памяти
Динамический, непредсказуемый
Статический, заранее выделенный пул PMR
Parsing Logic
Runtime map insertion
Memory Footprint
Dynamic, unpredictable
Заголовок деструктора
~12 деструкторов std::string
HEAP · на сообщение12 выделений
0x7f3a..0000разрозненно
NexusFIX /order-flow горячий путь
0 выделений · переиспольз. арены
Таблица смещений во время компиляции
0
Динамический, непредсказуемый
std::span views into original buffer
Parsing Logic
Compile-time offset table
Memory Footprint
Static, pre-allocated PMR pool
Заголовок деструктора
0 (нет собственной памяти)
ARENA · на сообщение0 выделений
0x0001..a000непрерывно · переиспольз.

Сравнение методов.

Проектные решения, которые увеличивают производительность в 3 раза.

ТехникаQuickFIXNexusFIX
ПамятьВыделение кучи на сообщениеНулевая копия std::spanviews
Поиск поляO(log n) std::mapO(1) прямой массив индексирование
РазборПобайтовое сканированиеAVX2 SIMD векторизованный
Смещения полейВычисление времени выполненияconsteval время компиляции
Преобразование перечисленияПереключатель времени выполнения (~300 ветвей)22 таблицы поиска во время компиляции
Обработка ошибокИсключенияstd::expected (без броска)

Влияние архитектуры.

Изучено 11 ведущих отраслевых библиотек. Что мы узнали, что мы построили, что мы измерили.

hffix
Что мы узнали

Поиск итератора O(n) неоптимален для плотных пакетов FIX

Что мы построили

consteval смещения полей + прямая индексация O(1)

доступ к полю 14ns
Результат
Abseil
Что мы узнали

Swiss Tables с SIMD-зондированием и отпечатками H2

Что мы построили

absl::flat_hash_map для хранилища сеансов

Поиск на 31 % быстрее
Результат
Quill
Что мы узнали

Очередь SPSC без блокировки с отложенным форматированием

Что мы построили

Quill как серверная часть регистрации

Средняя задержка журнала 8 нс
Результат
NanoLog
Что мы узнали

Двоичное кодирование + фоновый поток для регистрации 7 нс

Что мы построили

DeferredProcessor<T> со статической двоичной сериализацией

Сокращение на 84% (75→12 нс)
Результат
Liburing
Что мы узнали

DEFER_TASKRUN исключает пробуждение задач ядра

Что мы построили

io_uring + зарегистрированные буферы + multishot

7-27% более быстрый ввод-вывод
Результат
Шоссе
Что мы узнали

Переносимая абстракция SIMD для наборов инструкций

Что мы построили

Сохранены встроенные функции, настроенные вручную для шаблонов FIX

13-кратная пропускная способность
Результат
Seastar
Что мы узнали

Share-nothing реактор для высокопараллельного ввода-вывода

Что мы построили

Закрепление ядра + конвейерная обработка без блокировок

Улучшение P99 на 8%
Результат
Безумие
Что мы узнали

Усовершенствованное ограждение памяти и примитивы без блокировки

Что мы построили

Встроенная очередь SPSC + проверка побитовой маски

Нулевая зависимость
Результат
Rigtorp
Что мы узнали

Заполнение строк кэша исключает ложное совместное использование

Что мы построили

Встроенная очередь SPSC с идентичными методами

88 млн операций в секунду, 11 нс
Результат
xsimd
Что мы узнали

Общие оболочки SIMD для математических операций

Что мы построили

Прямые встроенные функции Intel для сканирования SOH

в 2 раза быстрее, чем оболочки
Результат
Boost.PMR
Что мы узнали

Монотонный буфер позволяет выделять арену для каждого сообщения

Что мы построили

std::pmr::monotonic_buffer_resource

Нулевое выделение кучи
Результат

Готовы попробовать NexusFIX?

Три команды для самостоятельного создания и запуска тестов.

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