StratCraft

效能基準測試

實測結果,非行銷數據。所有基準在 Linux 上使用 GCC 13.3、100,000 次迭代、CPU 綁定執行。

NexusFIX vs QuickFIX

核心 FIX 操作的正面比較。

指標QuickFIXNexusFIX提升幅度
ExecutionReport 解析730 ns246 ns快 3.0x
NewOrderSingle 解析661 ns229 ns快 2.9x
欄位存取(4 個欄位)31 ns11 ns快 2.9x
吞吐量1.19M msg/sec4.17M msg/sec高 3.5x
P99 延遲784 ns258 ns低 3.0x

最佳化歷程

我們如何在四個累積階段中從 730ns 降至 246ns。

第一階段:零拷貝解析730ns → 520ns

以 std::span<const char> 視圖取代 std::string 拷貝,指向原始緩衝區。std::span 在堆疊上佔 16 位元組 — 無堆積、無拷貝、無解構函式。

第二階段:O(1) 欄位查詢520ns → 380ns

以預索引陣列取代 std::map<int, std::string>。欄位存取變為以 FIX 標籤號索引的單一 mov 指令。

第三階段:SIMD 分隔符掃描380ns → 290ns

AVX2 向量化 SOH 分隔符掃描每週期處理 32 位元組。比逐位元組掃描快約 13 倍。

第四階段:編譯期偏移量290ns → 246ns

consteval 欄位偏移量表和 22 個編譯期查詢表消除了約 300 個執行期的列舉/類型轉換分支。

零分配證明

在熱路徑上處理 NewOrderSingle 訊息。

操作QuickFIXNexusFIX
堆積分配~12 個(std::string、std::map 節點)0
欄位儲存std::map<int, std::string> 拷貝std::span 視圖指向原始緩衝區
解析邏輯執行期 map 插入編譯期偏移量表
記憶體佔用動態、不可預測靜態、預分配 PMR 池
解構函式開銷~12 個 std::string 解構函式0(無擁有記憶體)

技術比較

累積達到 3 倍效能的設計決策。

技術QuickFIXNexusFIX
記憶體每訊息堆積分配零拷貝 std::span 視圖
欄位查詢O(log n) std::mapO(1) 直接陣列索引
解析逐位元組掃描AVX2 SIMD 向量化
欄位偏移量執行期計算consteval 編譯期
列舉轉換執行期 switch(~300 分支)22 個編譯期查詢表
錯誤處理例外std::expected(不拋出)

架構影響

研究了 11 個業界領先的函式庫。我們學到什麼、我們建構什麼、我們測量什麼。

函式庫我們學到的我們建構的結果
hffixO(n) 迭代器查詢對密集 FIX 封包並非最優consteval 欄位偏移量 + O(1) 直接索引14ns 欄位存取
AbseilSwiss Tables 結合 SIMD 探測和 H2 指紋absl::flat_hash_map 用於會話儲存查詢速度提升 31%
Quill無鎖 SPSC 佇列和延遲格式化Quill 作為日誌後端中位數日誌延遲 8ns
NanoLog二進制編碼 + 背景執行緒實現 7ns 日誌DeferredProcessor<T> 和靜態二進制序列化降低 84%(75→12ns)
liburingDEFER_TASKRUN 消除核心任務喚醒io_uring + 已登錄緩衝區 + multishotI/O 快 7-27%
Highway跨指令集的可攜式 SIMD 抽象保留手動調整的 FIX 模式 intrinsics13x 吞吐量
Seastar高併發 I/O 的無共享 reactorCore 綁定 + 無鎖流水線P99 改善 8%
Folly進階記憶體柵欄和無鎖原語原生 SPSC 佇列 + 位元遮罩驗證零依賴
Rigtorp快取行填充消除假共享使用相同技術的原生 SPSCQueue88M ops/sec,11ns
xsimd數學運算的通用 SIMD 包裝直接使用 Intel intrinsics 進行 SOH 掃描比包裝快 2x
Boost.PMR單調緩衝區支援每訊息 arena 分配std::pmr::monotonic_buffer_resource零堆積分配

準備好試用 NexusFIX?

三個指令即可自行建置並執行基準測試。

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