这是一个高性能的、基于内存的撮合引擎,采用 Rust 作为上层业务逻辑与异步日志系统,核心撮合算法则通过 C++17 实现,以达到极致的性能表现。
在典型硬件配置下,本引擎表现出卓越的处理能力:
- 测试环境:Intel Core i9-14900HX
- 吞吐量 (TPS):在开启异步日志回调的情况下,处理能力约为 2300万单/秒 (2300w TPS)。
- 处理延迟:单笔订单处理延迟保持在纳秒 (ns) 级别。
注意:性能受配置开关
ENABLE_LOGGING影响。关闭日志可进入纯粹跑分模式,进一步降低延迟。
- 高性能核心:核心撮合逻辑使用 C++ 编写,通过双向链表和预分配内存池(Intrusive Linked List & Memory Pool)实现 时间复杂度的订单处理。
- Rust & C++ 混合编程:利用 Rust 的安全性管理内存与多线程,通过 FFI (Foreign Function Interface) 调用 C++ 撮合内核。
- 低延迟异步日志:基于 Rust 的
mpsc频道实现异步日志落盘,撮合主线程与 IO 线程解耦,确保日志记录不阻塞撮合流程。 - 内存池管理:预分配了可容纳 800 万个订单节点的内存池,减少运行时内存分配(malloc/free)带来的延迟开销。
- 指令集优化:在编译阶段针对不同平台进行了深度优化,如在 Windows 环境下开启 AVX2 指令集优化。
- 撮合内核 (
src/engine.cpp):维护买卖盘(OrderBook),实现限价单撮合与订单撤单逻辑。 - 数据模型 (
src/models.rs,src/order.h):定义了订单(Order)、侧向(Side)和成交日志(TradeLog)等跨语言对齐的基础结构。 - Rust 封装层 (
src/engine_wrapper.rs):提供安全的 Rust 接口,负责与 C++ 底层进行通信和对象生命周期管理。 - 日志系统 (
src/logger.rs,src/bridge.rs):通过 FFI 回调机制,将 C++ 产生的成交信息实时回传给 Rust 异步线程进行持久化。
项目包含内置的 Benchmark 工具,可直接对引擎进行压力测试。
- 测试入口:
src/benchmark.rs - 指标:支持统计总订单数、运行总时长、TPS(每秒成交数)以及单笔订单处理延迟(纳秒级)。
- Rust: 需支持
edition 2024。 - C++ 编译器:
- Windows: 推荐使用 MSVC (Visual Studio 2022) 或支持 AVX2 的 GCC/Clang。
- Linux: 需要支持 C++17 的 GCC 或 Clang。
- 生成测试数据: 使用提供的 Python 脚本生成 1000 万笔模拟订单数据:
python gen_data.py
- 编译项目:
cargo build --release
注意:Release 模式下开启了 LTO(Fat)和 Codegen Units 优化以获得最高性能。 3. 运行 Benchmark:
cargo run --release
在 src/main.rs 中可以调整以下配置:
ENABLE_LOGGING: 是否开启异步日志记录。关闭日志可获得纯粹的撮合性能。DATA_FILE: 指定输入的 CSV 订单文件路径。
为了实现极致性能,本项目在数据结构和内存管理上进行了针对性优化:
传统的 std::list 会为每个节点单独分配内存,导致严重的内存碎片和缓存不命中。本引擎采用了侵入式设计:
- 结构集成:
OrderNode结构体直接包含prev和next指针(在此实现中为int32_t类型的索引)。 - 内存池化:所有节点存储在预分配的
std::vector<OrderNode>(名为order_pool) 中。 - 优势:
- ** 分配与释放**:通过
pool_head管理空闲链表,alloc_node和free_node仅需简单的索引交换。 - 缓存友好:节点在物理内存中紧凑排列,大幅提升了 CPU 缓存命中率。
- 无分支哨兵:
OrderQueue使用哨兵节点(Sentinel)来消除push和erase操作中的分支预测开销。
在撮合引擎的 Hot Path(热路径)上,字典查找往往是瓶颈。本引擎通过空间换时间的策略消灭了哈希表和红黑树:
-
价格映射 (
Buckets):由于价格范围已知且离散(MAX_PRICE = 100,000),我们直接使用std::vector<OrderQueue>。每个价格点对应一个数组下标。 -
优点:查找特定价格的队列只需一次内存偏移计算(),远快于
std::map的 或std::unordered_map的哈希计算。 -
订单定位 (
OrderLocation):通过std::vector<OrderLocation>存储所有活跃订单的物理位置。 -
实现:使用
OrderId直接作为vector索引。撤单时,通过 ID 直接定位到节点在order_pool中的下标进行erase。
- Best Price 缓存:
OrderBook维护了一个best_price变量。 - 线性扫描延迟更新:当当前最优价的订单被吃完时,引擎会进行线性扫描以寻找下一个最优价。由于交易通常集中在盘口附近(高斯分布),这种扫描在实际场景中非常高效。