實測結果,非行銷數據。所有基準在 Linux 上使用 GCC 13.3、100,000 次迭代、CPU 綁定執行。
核心 FIX 操作的正面比較。
我們如何在四個累積階段中從 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 訊息。
累積達到 3 倍效能的設計決策。
| 技術 | QuickFIX | NexusFIX |
|---|---|---|
| 記憶體 | 每訊息堆積分配 | 零拷貝 std::span 視圖 |
| 欄位查詢 | O(log n) std::map | O(1) 直接陣列索引 |
| 解析 | 逐位元組掃描 | AVX2 SIMD 向量化 |
| 欄位偏移量 | 執行期計算 | consteval 編譯期 |
| 列舉轉換 | 執行期 switch(~300 分支) | 22 個編譯期查詢表 |
| 錯誤處理 | 例外 | std::expected(不拋出) |
研究了 11 個業界領先的函式庫。我們學到什麼、我們建構什麼、我們測量什麼。
O(n) 迭代器查詢對密集 FIX 封包並非最優
consteval 欄位偏移量 + O(1) 直接索引
Swiss Tables 結合 SIMD 探測和 H2 指紋
absl::flat_hash_map 用於會話儲存
無鎖 SPSC 佇列和延遲格式化
Quill 作為日誌後端
二進制編碼 + 背景執行緒實現 7ns 日誌
DeferredProcessor<T> 和靜態二進制序列化
DEFER_TASKRUN 消除核心任務喚醒
io_uring + 已登錄緩衝區 + multishot
跨指令集的可攜式 SIMD 抽象
保留手動調整的 FIX 模式 intrinsics
高併發 I/O 的無共享 reactor
Core 綁定 + 無鎖流水線
進階記憶體柵欄和無鎖原語
原生 SPSC 佇列 + 位元遮罩驗證
快取行填充消除假共享
使用相同技術的原生 SPSCQueue
數學運算的通用 SIMD 包裝
直接使用 Intel intrinsics 進行 SOH 掃描
單調緩衝區支援每訊息 arena 分配
std::pmr::monotonic_buffer_resource
$ 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