面向 NexusFIX 架构、消息字典、场所配置和基准测试套件的对话式界面。 182 个专家解答的问题 已索引并以实时代码库为基础。当固定答案不够时,可进入实时线程。
你好,我是 NexusFIX 专家,基于公开源代码、基准 CSV 和本页索引的 182 个精选答案。
从右侧选一个话题,或者在下方提问。如果答案不在源代码中,我会明确告知。
NexusFIX 如何实现零堆分配?
热路径上有三处替换:
1. std::span<const char> 视图直接指向原始缓冲区,替代 std::string 拷贝。span 在栈上占 16 字节。无堆、无拷贝、无析构。
2. 预索引数组替代 std::map 用于字段查找。字段访问变为单条以 FIX 标签号为索引的 mov 指令。
3. std::pmr::monotonic_buffer_resource 为确实需要分配的内容提供 arena 分配。Arena 预先分配大小,按会话复用。
结果是热路径上 0 次 malloc 调用,通过自定义分配器验证,该分配器对每次 alloc/free 进行埋点,任一发生即测试失败。
几乎每次对话都会涉及的八个问题。点击任一展开,或者拉回到上方实时线程。
QuickFIX 设计于 2000 年代初期,围绕 C++98/03 习语:虚函数派发、每消息堆分配、基于字符串的字段存储。这些模式与亚微秒延迟根本不兼容。
我们使用 QuickFIX 设计时还不存在的 C++23 能力,从第一性原理重新开始。Std::span、std::expected、std::pmr、概念和 consteval。并提出问题:如果不背负二十年的分配器决策,FIX 引擎会是什么样子?
需要确定性、亚微秒 FIX 消息处理的量化交易公司和基础设施团队。
具体来说:运行托管策略的公司、构建自定义交易网关的团队,以及在真实公开代码库上学习现代性能技术的 C++ 工程师。
std::span
结果是热路径上零 malloc 调用,通过在每次 CI 构建上运行的自定义分配器埋点框架验证。
std::expected 用于错误处理(热路径无异常)、std::span 用于零拷贝数据视图、概念用于编译期接口验证、consteval 用于编译期计算,以及 [[likely]]/[[unlikely]] 分支提示。
在 QuickFIX 的时代,这些每一个都需要自定义手写实现。
AVX2 指令一次加载 32 字节,并使用向量化比较并行查找 SOH (\x01) 分隔符。这比逐字节扫描快约 13 倍。
该技术受 simdjson 启发但针对 FIX 协议语义进行了调整。即 tag=value=SOH 结构意味着我们可以在单次向量化遍历中定位每个字段边界,然后构建偏移量表。
FIX 4.4 完全支持,是生产环境中最常用的版本。FIX 5.0 + FIXT 1.1 也完全支持,与 4.4 相比仅有 2% 的额外开销。
结构索引与版本无关。字段扫描在所有 FIX 版本中工作方式相同。自定义方言覆盖在会话绑定时处理特定场所的标签。
NexusFIX 正在积极开发中,尚未部署到生产交易环境。基准测试来自受控环境,使用 CPU 固定和缓存预热。
生产加固。浸泡测试、故障模式覆盖、针对特定场所网关的认证。是一个独立的工程工作。如果你正在考虑用于生产,请先与我们联系。
Fix8(C++11)使用对象池和零拷贝技术,是更成熟的开源 FIX 引擎之一。
NexusFIX 的不同之处在于利用 C++23 标准库特性(PMR、std::span、std::expected)而非自定义实现。需要审计的活动部件更少。并增加了 Fix8 没有的 SIMD 加速解析。