
Измеренные результаты, а не маркетинговые заявления. Все тесты выполняются в Linux с GCC 13.3, 100 000 итераций, с привязкой к ЦП.
Непосредственное сравнение основных операций 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нс за четыре этапа компаундирования.
Замените копии std::string представлениями std::span<const char> в исходном буфере. Std::span занимает 16 байт в стеке — без кучи, без копирования, без деструктора.
Замените std::map<int, std::string> предварительно индексированным массивом. Доступ к полю становится одной командой перемещения, индексируемой номером тега FIX.
Векторизованное сканирование разделителя SOH AVX2 обрабатывает 32 байта за цикл. ~ в 13 раз быстрее, чем побайтовое сканирование.
Таблицы смещения полей consteval и 22 таблицы поиска во время компиляции исключают ~300 ветвей времени выполнения для преобразования перечислений/типов. std::string> копирует
Логика синтаксического анализа
| Вставка карты времени выполнения | QuickFIX | NexusFIX |
|---|---|---|
| Таблица смещений во время компиляции | Объём памяти | 0 |
| Динамический, непредсказуемый | Статический, заранее выделенный пул PMR | std::span views into original buffer |
| Parsing Logic | Runtime map insertion | Compile-time offset table |
| Memory Footprint | Dynamic, unpredictable | Static, pre-allocated PMR pool |
| Заголовок деструктора | ~12 деструкторов std::string | 0 (нет собственной памяти) |
Проектные решения, которые увеличивают производительность в 3 раза.
| Техника | QuickFIX | NexusFIX |
|---|---|---|
| Память | Выделение кучи на сообщение | Нулевая копия std::spanviews |
| Поиск поля | O(log n) std::map | O(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 | Нулевое выделение кучи |
Три команды для самостоятельного создания и запуска тестов.
git clone https://github.com/StratCraft/NexusFIX.git
cd NexusFIX
./start.sh build