
實測結果,非行銷數據。所有基準在 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。
以 std::span<const char> 視圖取代 std::string 拷貝,指向原始緩衝區。std::span 在堆疊上佔 16 位元組 — 無堆積、無拷貝、無解構函式。
以預索引陣列取代 std::map<int, std::string>。欄位存取變為以 FIX 標籤號索引的單一 mov 指令。
AVX2 向量化 SOH 分隔符掃描每週期處理 32 位元組。比逐位元組掃描快約 13 倍。
consteval 欄位偏移量表和 22 個編譯期查詢表消除了約 300 個執行期的列舉/類型轉換分支。
在熱路徑上處理 NewOrderSingle 訊息。
| 操作 | QuickFIX | NexusFIX |
|---|---|---|
| 堆積分配 | ~12 個(std::string、std::map 節點) | 0 |
| 欄位儲存 | std::map<int, std::string> 拷貝 | std::span 視圖指向原始緩衝區 |
| 解析邏輯 | 執行期 map 插入 | 編譯期偏移量表 |
| 記憶體佔用 | 動態、不可預測 | 靜態、預分配 PMR 池 |
| 解構函式開銷 | ~12 個 std::string 解構函式 | 0(無擁有記憶體) |
累積達到 3 倍效能的設計決策。
| 技術 | QuickFIX | NexusFIX |
|---|---|---|
| 記憶體 | 每訊息堆積分配 | 零拷貝 std::span 視圖 |
| 欄位查詢 | O(log n) std::map | O(1) 直接陣列索引 |
| 解析 | 逐位元組掃描 | AVX2 SIMD 向量化 |
| 欄位偏移量 | 執行期計算 | consteval 編譯期 |
| 列舉轉換 | 執行期 switch(~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 作為日誌後端 | 中位數日誌延遲 8ns |
| NanoLog | 二進制編碼 + 背景執行緒實現 7ns 日誌 | DeferredProcessor<T> 和靜態二進制序列化 | 降低 84%(75→12ns) |
| liburing | DEFER_TASKRUN 消除核心任務喚醒 | io_uring + 已登錄緩衝區 + multishot | I/O 快 7-27% |
| Highway | 跨指令集的可攜式 SIMD 抽象 | 保留手動調整的 FIX 模式 intrinsics | 13x 吞吐量 |
| Seastar | 高併發 I/O 的無共享 reactor | Core 綁定 + 無鎖流水線 | P99 改善 8% |
| Folly | 進階記憶體柵欄和無鎖原語 | 原生 SPSC 佇列 + 位元遮罩驗證 | 零依賴 |
| Rigtorp | 快取行填充消除假共享 | 使用相同技術的原生 SPSCQueue | 88M ops/sec,11ns |
| xsimd | 數學運算的通用 SIMD 包裝 | 直接使用 Intel intrinsics 進行 SOH 掃描 | 比包裝快 2x |
| Boost.PMR | 單調緩衝區支援每訊息 arena 分配 | std::pmr::monotonic_buffer_resource | 零堆積分配 |
三個指令即可自行建置並執行基準測試。
git clone https://github.com/StratCraft/NexusFIX.git\ncd NexusFIX\n./start.sh build