← NexusFIX/ベンチマーク
ベンチマーク · v1.8 · 2026 年 5 月

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

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

ExecutionReport 解析
246 ns
QuickFIX 730 ns3.0x 高速
スループット
4.17M msg/sec
QuickFIX 1.19M msg/sec3.5x 高い
P99 レイテンシー
258 ns
QuickFIX 784 ns3.0x 低い
ヒープアロケーション / メッセージ
0
QuickFIX 約 12 個(std::string、std::map ノード)アリーナ再利用

NexusFIX vs QuickFIX.

コア 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 つの複合フェーズでの改善過程。

200 ns400 ns600 ns730 nsベースラインベースライン520 ns−210フェーズ 1380 ns−140フェーズ 2290 ns−90フェーズ 3246 ns−44フェーズ 4合計 · -484NS · 3.0× 高速
1 フェーズ 1: ゼロコピー解析
730ns → 520ns

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

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

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

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

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

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

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

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

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

QuickFIX /order-flow ホットパス
~12 ヒープ割り当て
ヒープアロケーション
約 12 個(std::string、std::map ノード)
フィールド格納
std::map<int, std::string> コピー
解析ロジック
ランタイム map 挿入
メモリフットプリント
動的、予測不能
デストラクタオーバーヘッド
約 12 の std::string デストラクタ
HEAP · メッセージ毎12 割り当て
0x7f3a..0000分散
NexusFIX /order-flow ホットパス
0 割り当て · アリーナ再利用
ヒープアロケーション
0
フィールド格納
元バッファへの std::span ビュー
解析ロジック
コンパイル時オフセットテーブル
メモリフットプリント
静的、事前割り当て PMR プール
デストラクタオーバーヘッド
0(所有メモリなし)
ARENA · メッセージ毎0 割り当て
0x0001..a000連続 · 再利用

テクニック比較.

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

テクニックQuickFIXNexusFIX
メモリメッセージ毎のヒープアロケーションゼロコピー std::span ビュー
フィールドルックアップO(log n) std::mapO(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 を使用

ヒープアロケーションゼロ
結果

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

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

~/dev. Bench
$ 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