Files
fidc-backtest-engine/docs/expression-context-performance-20260913.md
T

6.4 KiB
Raw Permalink Blame History

表达式上下文性能验收

范围

本轮优化 FIDC 引擎的逐股票表达式上下文,不修改策略、因子值、窗口、时间可见性、 选股/订单规则、费用、成交价、风控或公司行为。Source 保持 d5b682c6d097, 研究和信号保持暂停。其他用户任务只读观察,不更改其进程、亲和性或配置。

已完成编译、回归、正式回放与177发布验收,不能据此关闭整个目标。

重复开销

  1. DataSet 已采用 NumericFactorMap,但 StockExpressionState 仍把数值因子 重建为 BTreeMap<String, f64>,增加树节点和字符串分配。
  2. 每日可用因子名集合先为每个证券复制名称,再由集合丢弃重复名称。

候选在表达式上下文延续紧凑数值存储。每日名称仍按当日真实字段生成完整集合, 仅改为先对借用名称去重,再为唯一名称分配字符串;文本因子同理。 没有用全局/未来日期目录替代当日字段,没有缓存选股结果或账户状态。 Rhai factors[...]、缺失、NaN、负零、别名、覆盖顺序与已完成交易日可见性保持原行为。

CPU 计时

Runner 新增以下运行计时,HTTP benchmark 同样保留:

  • engineTaskWallSeconds:实际引擎同步任务的墙钟耗时,包含其同步数据读取等待。
  • engineThreadCpuSecondsLinux CLOCK_THREAD_CPUTIME_ID 实测的引擎调用线程CPU时间。 不包含其他并行线程、I/O等待或未被调度的时间;不可当作整个进程总CPU时间。 读取不可用、跨线程或时钟异常保持null,不填0。
  • engineTaskCount:实际执行引擎的次数,包含原有修复循环的重放。

这些是 engineSeconds 的子指标,禁止再次加到总耗时。正常耗时与诊断运行分开保存。 计时不改写历史制品,旧记录缺少该指标时保持未知。

验收设置

  • 固定引擎基线 fe7243b;候选为177的 07b7b18,对应本地 df1862e
  • 两边使用同一计时版service a9df11ab5d22ff仅补充benchmark字段读取。
  • 2021-08-23至2025-11-17、初始1000万、原冻结runtime与策略,1025个执行交易日。
  • 保留原 session_capacity_audit,不能当作实际开盘流动性验证。
  • 官方benchmark入口、Boris执行、同CPU资源与Source版本、新进程、相同数据缓存副本、 新结果目录,不复用回测结果。
  • 引擎780项、runner408项、API113项、脚本10项通过;9/8/3项手动或外部环境用例分别忽略。
  • 专项延伸验证紧凑因子的克隆、Rhai映射暴露、缺失、NaN及负零;CPU计时验证睡眠和跨线程边界。

证据根:/srv/fidc/canonical/run/research/engine-context-20260913

独立进程对照

次序 样本 完整墙钟 Source校验 数据准备 引擎墙钟 引擎线程CPU
1 control-1 31.234s 11.202s 8.393s 10.461s 10.458s
2 candidate-1 17.002s 0.004s 8.404s 7.406s 7.404s
3 candidate-2 18.203s 0.003s 8.371s 7.411s 7.408s
4 control-2 22.983s 0.004s 8.323s 13.401s 13.398s
5 control-3 30.714s 0.005s 15.318s 13.999s 13.990s
6 candidate-3 25.336s 0.005s 13.524s 10.471s 10.468s

首个基线的Source校验等待原样保留,不事后改称预热,不把11.202秒归因于引擎改动。 后段样本出现主机负载/缓存竞争变化,数据准备也变慢,不能直接用全组平均墙钟夸大提速。 相邻低负载对照的引擎线程CPU为10.458至7.404秒,后段为13.990至10.468秒。 CPU计时与任务墙钟非常接近,证明样本主要在执行CPU工作,而不是等待HTTP; 这不代表没有SMT、内存带宽或其他用户CPU竞争。

六次均为21,393笔成交,账户、权益、委托、成交、持仓和风控canonical及结果制品完全一致。 每份63个数据缓存文件经完整SHA核对相同,没有复制或读取旧回测结果。

HTTP 对照

状态 版本 运行ID 总耗时 引擎耗时
清DataSet,磁盘/Source保持 原版 btr_1789232559582_3166774_4 21.987s 11.328s
清DataSet,磁盘/Source保持 原版 btr_1789232585690_3166774_5 21.684s 11.259s
复用DataSet 原版 btr_1789232669598_3166774_6 11.820s 11.031s
复用DataSet 原版 btr_1789232684861_3166774_7 11.857s 11.067s
清DataSet,磁盘/Source保持 新版 btr_1789232818009_3320588_0 17.296s 7.537s
清DataSet,磁盘/Source保持 新版 btr_1789232839269_3320588_1 17.413s 7.627s
复用DataSet 新版 btr_1789232898983_3320588_2 8.549s 7.738s
复用DataSet 新版 btr_1789232910904_3320588_3 8.586s 7.784s

同状态HTTP均值:重建DataSet从21.836至17.355秒,减少约20.5% 复用DataSet从11.839至8.568秒,减少约27.6%。两种状态分开比较, 没有把8.568秒当作Source冷启动成绩。与上一轮不同时间的15/17秒样本不作直接百分比对比。

原版API没有线程CPU字段,保持null;新版本每次实际执行引擎一次, 两次重建的线程CPU为7.535/7.624秒。没有用新版本计时回填旧记录。 八次HTTP和六次独立回放的canonical及结果制品SHA全部相同,终态审计clean。

发布状态

177通过官方安装器发布 engine 07b7b181b60138c6ef1c965543c0e3192ac65903、 service b5d22ffab16f851eced3028e12fa02627ee4c399。 运行身份 fdd8652a47a5935be4d891beb3b8b0f3e19a468be166a902a2a97b85a9c9e01e

  • API SHAbf22f58946c3fa495161eb381a400d4e28d7c8d327ee46f5645d83a8308117cf
  • Runner SHA7b3849cd8af33d650db242add80c49cfdd32e8cc8686a614da7b3b4016ce2a60
  • 生产在用构建根:/srv/fidc/canonical/build/engine-context-candidate-20260913,禁止清理。
  • 原生因子能力目录发布前后字节相同,SHA为 cec37331a476bc39bdea32c308581b8ac2f86d005d8dd4cc7ba228c5d9dc9a2e
  • API PID3320588Boris、active、NRestarts=0Source仍为PID1700096/d5,研究未恢复。

完整结构化验收证据 SHA256 f526950e018354c1305922beebf4063ae3823004f8c5ab20510a452f98b7b7ea

边界

本轮真实长区间案例含一个原生扩展因子,动态映射、缺失及多字段语义另由引擎回归覆盖; 不宣称所有策略都具有相同比例提速。Source冷路径仍受独立冻结约束, 信号闭环和全部策略/分钟区间/财务PIT不在本轮通过范围内。