StratCraft

パフォーマンスベンチマーク

宣伝文句ではなく実測値。全ベンチマークは Linux、GCC 13.3、100,000 回の反復、CPU ピン留めで実行。

NexusFIX vs QuickFIX

コア FIX オペレーション全体での一対一比較。

指標QuickFIXNexusFIX改善率
ExecutionReport 解析730 ns246 ns3.0x 高速
NewOrderSingle 解析661 ns229 ns2.9x 高速
フィールドアクセス(4 フィールド)31 ns11 ns2.9x 高速
スループット1.19M msg/sec4.17M msg/sec3.5x 高い
P99 レイテンシー784 ns258 ns3.0x 低い

最適化の歩み

730ns から 246ns まで、4 つの複合フェーズでの改善過程。

フェーズ 1: ゼロコピー解析730ns → 520ns

std::string のコピーを元バッファへの std::span<const char> ビューに置き換え。std::span はスタック上 16 バイト — ヒープなし、コピーなし、デストラクタなし。

フェーズ 2: O(1) フィールドルックアップ520ns → 380ns

std::map<int, std::string> を事前インデックス配列に置き換え。フィールドアクセスが FIX タグ番号でインデックスされた単一の mov 命令に。

フェーズ 3: SIMD デリミタスキャン380ns → 290ns

AVX2 ベクトル化 SOH デリミタスキャンでサイクルあたり 32 バイトを処理。バイト単位スキャンの約 13 倍高速。

フェーズ 4: コンパイル時オフセット290ns → 246ns

consteval フィールドオフセットテーブルと 22 のコンパイル時ルックアップテーブルにより、enum/型変換の約 300 のランタイム分岐を排除。

ゼロアロケーションの証明

ホットパスで NewOrderSingle メッセージを処理。

オペレーションQuickFIXNexusFIX
ヒープアロケーション約 12 個(std::string、std::map ノード)0
フィールド格納std::map<int, std::string> コピー元バッファへの std::span ビュー
解析ロジックランタイム map 挿入コンパイル時オフセットテーブル
メモリフットプリント動的、予測不能静的、事前割り当て PMR プール
デストラクタオーバーヘッド約 12 の std::string デストラクタ0(所有メモリなし)

テクニック比較

3x パフォーマンスに積み重なる設計上の決断。

テクニックQuickFIXNexusFIX
メモリメッセージ毎のヒープアロケーションゼロコピー std::span ビュー
フィールドルックアップO(log n) std::mapO(1) 直接配列インデックス
解析バイト単位スキャンAVX2 SIMD ベクトル化
フィールドオフセットランタイム計算consteval コンパイル時
Enum 変換ランタイム switch(約 300 分岐)22 のコンパイル時ルックアップテーブル
エラー処理例外std::expected(スロー不要)

アーキテクチャの参考文献

11 の業界トップライブラリを研究。学んだこと、構築したこと、計測したこと。

ライブラリ学んだこと構築したこと結果
hffixO(n) イテレータルックアップは密な FIX パケットに対して最適でないconsteval フィールドオフセット + O(1) 直接インデックス14ns フィールドアクセス
AbseilSIMD プローブと H2 フィンガープリントを使用した Swiss Tablesセッションストアに absl::flat_hash_map31% 高速なルックアップ
Quill遅延フォーマットのロックフリー SPSC キューロギングバックエンドとして Quill を使用8ns 中央値ログレイテンシー
NanoLogバイナリエンコーディング + バックグラウンドスレッドで 7ns ロギング静的バイナリシリアライゼーションの DeferredProcessor<T>84% 削減(75→12ns)
liburingDEFER_TASKRUN はカーネルタスクのウェイクアップを排除io_uring + 登録バッファ + マルチショット7-27% 高速な I/O
Highway命令セット間のポータブル SIMD 抽象化FIX パターン用に手チューニングされた intrinsics を維持13x スループット
Seastar高並行 I/O のためのシェアードナッシングリアクターコアピン留め + ロックフリーパイプライン8% P99 改善
Folly高度なメモリフェンシングとロックフリープリミティブネイティブ SPSC キュー + ビットマスキング検証依存関係ゼロ
Rigtorpキャッシュライン埋め込みでフォルスシェアリングを排除同様の手法でネイティブ SPSCQueue を実装88M ops/sec、11ns
xsimd数値演算用の汎用 SIMD ラッパーSOH スキャンに直接 Intel intrinsics を使用ラッパー比 2 倍高速
Boost.PMRモノトニックバッファでメッセージ毎のアリーナアロケーションが可能std::pmr::monotonic_buffer_resource を使用ヒープアロケーションゼロ

NexusFIX を試す準備ができましたか?

3 つのコマンドで自分でビルドしてベンチマークを実行できます。

git clone https://github.com/StratCraft/NexusFIX.git\ncd NexusFIX\n./start.sh build