宣伝文句ではなく実測値。全ベンチマークは Linux、GCC 13.3、100,000 回の反復、CPU ピン留めで実行。
コア FIX オペレーション全体での一対一比較。
730ns から 246ns まで、4 つの複合フェーズでの改善過程。
std::string のコピーを元バッファへの std::span<const char> ビューに置き換え。std::span はスタック上 16 バイト, ヒープなし、コピーなし、デストラクタなし。
std::map<int, std::string> を事前インデックス配列に置き換え。フィールドアクセスが FIX タグ番号でインデックスされた単一の mov 命令に。
AVX2 ベクトル化 SOH デリミタスキャンでサイクルあたり 32 バイトを処理。バイト単位スキャンの約 13 倍高速。
consteval フィールドオフセットテーブルと 22 のコンパイル時ルックアップテーブルにより、enum/型変換の約 300 のランタイム分岐を排除。
ホットパスで NewOrderSingle メッセージを処理。
3x パフォーマンスに積み重なる設計上の決断。
| テクニック | QuickFIX | NexusFIX |
|---|---|---|
| メモリ | メッセージ毎のヒープアロケーション | ゼロコピー std::span ビュー |
| フィールドルックアップ | O(log n) std::map | O(1) 直接配列インデックス |
| 解析 | バイト単位スキャン | AVX2 SIMD ベクトル化 |
| フィールドオフセット | ランタイム計算 | consteval コンパイル時 |
| Enum 変換 | ランタイム switch(約 300 分岐) | 22 のコンパイル時ルックアップテーブル |
| エラー処理 | 例外 | std::expected(スロー不要) |
11 の業界トップライブラリを研究。学んだこと、構築したこと、計測したこと。
O(n) イテレータルックアップは密な FIX パケットに対して最適でない
consteval フィールドオフセット + O(1) 直接インデックス
SIMD プローブと H2 フィンガープリントを使用した Swiss Tables
セッションストアに absl::flat_hash_map
遅延フォーマットのロックフリー SPSC キュー
ロギングバックエンドとして Quill を使用
バイナリエンコーディング + バックグラウンドスレッドで 7ns ロギング
静的バイナリシリアライゼーションの DeferredProcessor<T>
DEFER_TASKRUN はカーネルタスクのウェイクアップを排除
io_uring + 登録バッファ + マルチショット
命令セット間のポータブル SIMD 抽象化
FIX パターン用に手チューニングされた intrinsics を維持
高並行 I/O のためのシェアードナッシングリアクター
コアピン留め + ロックフリーパイプライン
高度なメモリフェンシングとロックフリープリミティブ
ネイティブ SPSC キュー + ビットマスキング検証
キャッシュライン埋め込みでフォルスシェアリングを排除
同様の手法でネイティブ SPSCQueue を実装
数値演算用の汎用 SIMD ラッパー
SOH スキャンに直接 Intel intrinsics を使用
モノトニックバッファでメッセージ毎のアリーナアロケーションが可能
std::pmr::monotonic_buffer_resource を使用
$ 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