StratCraft

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

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

NexusFIX и QuickFIX

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

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

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

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

Фаза 1: синтаксический анализ с нулевым копированием730нс → 520нс

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

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

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

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

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

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

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

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

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

Вставка карты времени выполненияQuickFIXNexusFIX
Таблица смещений во время компиляцииОбъём памяти0
Динамический, непредсказуемыйСтатический, заранее выделенный пул PMRstd::span views into original buffer
Parsing LogicRuntime map insertionCompile-time offset table
Memory FootprintDynamic, unpredictableStatic, pre-allocated PMR pool
Заголовок деструктора~12 деструкторов std::string0 (нет собственной памяти)

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

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

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

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

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

БиблиотекаЧто мы узналиЧто мы построилиРезультат
hffixПоиск итератора O(n) неоптимален для плотных пакетов FIXconsteval смещения полей + прямая индексация O(1)доступ к полю 14ns
AbseilSwiss Tables с SIMD-зондированием и отпечатками H2absl::flat_hash_map для хранилища сеансовПоиск на 31 % быстрее
QuillОчередь SPSC без блокировки с отложенным форматированиемQuill как серверная часть регистрацииСредняя задержка журнала 8 нс
NanoLogДвоичное кодирование + фоновый поток для регистрации 7 нсDeferredProcessor<T> со статической двоичной сериализациейСокращение на 84% (75→12 нс)
LiburingDEFER_TASKRUN исключает пробуждение задач ядраio_uring + зарегистрированные буферы + multishot7-27% более быстрый ввод-вывод
ШоссеПереносимая абстракция SIMD для наборов инструкцийСохранены встроенные функции, настроенные вручную для шаблонов FIX13-кратная пропускная способность
SeastarShare-nothing реактор для высокопараллельного ввода-выводаЗакрепление ядра + конвейерная обработка без блокировокУлучшение P99 на 8%
БезумиеУсовершенствованное ограждение памяти и примитивы без блокировкиВстроенная очередь SPSC + проверка побитовой маскиНулевая зависимость
RigtorpЗаполнение строк кэша исключает ложное совместное использованиеВстроенная очередь SPSC с идентичными методами88 млн операций в секунду, 11 нс
xsimdОбщие оболочки SIMD для математических операцийПрямые встроенные функции Intel для сканирования SOHв 2 раза быстрее, чем оболочки
Boost.PMRМонотонный буфер позволяет выделять арену для каждого сообщенияstd::pmr::monotonic_buffer_resourceНулевое выделение кучи

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

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

git clone https://github.com/StratCraft/NexusFIX.git cd NexusFIX ./start.sh build