
宣伝文句ではなく実測値。全ベンチマークは Linux、GCC 13.3、100,000 回の反復、CPU ピン留めで実行。
コア FIX オペレーション全体での一対一比較。
| 指標 | QuickFIX | NexusFIX | 改善率 |
|---|---|---|---|
| ExecutionReport 解析 | 730 ns | 246 ns | 3.0x 高速 |
| NewOrderSingle 解析 | 661 ns | 229 ns | 2.9x 高速 |
| フィールドアクセス(4 フィールド) | 31 ns | 11 ns | 2.9x 高速 |
| スループット | 1.19M msg/sec | 4.17M msg/sec | 3.5x 高い |
| P99 レイテンシー | 784 ns | 258 ns | 3.0x 低い |
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 メッセージを処理。
| オペレーション | QuickFIX | NexusFIX |
|---|---|---|
| ヒープアロケーション | 約 12 個(std::string、std::map ノード) | 0 |
| フィールド格納 | std::map<int, std::string> コピー | 元バッファへの std::span ビュー |
| 解析ロジック | ランタイム map 挿入 | コンパイル時オフセットテーブル |
| メモリフットプリント | 動的、予測不能 | 静的、事前割り当て PMR プール |
| デストラクタオーバーヘッド | 約 12 の std::string デストラクタ | 0(所有メモリなし) |
3x パフォーマンスに積み重なる設計上の決断。
| テクニック | QuickFIX | NexusFIX |
|---|---|---|
| メモリ | メッセージ毎のヒープアロケーション | ゼロコピー std::span ビュー |
| フィールドルックアップ | O(log n) std::map | O(1) 直接配列インデックス |
| 解析 | バイト単位スキャン | AVX2 SIMD ベクトル化 |
| フィールドオフセット | ランタイム計算 | consteval コンパイル時 |
| Enum 変換 | ランタイム switch(約 300 分岐) | 22 のコンパイル時ルックアップテーブル |
| エラー処理 | 例外 | std::expected(スロー不要) |
11 の業界トップライブラリを研究。学んだこと、構築したこと、計測したこと。
| ライブラリ | 学んだこと | 構築したこと | 結果 |
|---|---|---|---|
| hffix | O(n) イテレータルックアップは密な FIX パケットに対して最適でない | consteval フィールドオフセット + O(1) 直接インデックス | 14ns フィールドアクセス |
| Abseil | SIMD プローブと H2 フィンガープリントを使用した Swiss Tables | セッションストアに absl::flat_hash_map | 31% 高速なルックアップ |
| Quill | 遅延フォーマットのロックフリー SPSC キュー | ロギングバックエンドとして Quill を使用 | 8ns 中央値ログレイテンシー |
| NanoLog | バイナリエンコーディング + バックグラウンドスレッドで 7ns ロギング | 静的バイナリシリアライゼーションの DeferredProcessor<T> | 84% 削減(75→12ns) |
| liburing | DEFER_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 を使用 | ヒープアロケーションゼロ |
3 つのコマンドで自分でビルドしてベンチマークを実行できます。
git clone https://github.com/StratCraft/NexusFIX.git\ncd NexusFIX\n./start.sh build