JIT 编译
Navi 包含一个可选的 JIT 编译器,可在构建时将 Navi 脚本编译为原生机器码。对于在大量 bar 上运行的计算密集型脚本,JIT 能带来显著的吞吐量提升。
启用 JIT
JIT 支持通过编译期 feature 开关控制。在依赖中添加 jit feature:
toml
[dependencies]
navi-vm = { version = "...", features = ["jit"] }然后在实例构建器上启用 JIT:
rust
let mut instance = Instance::builder(bars, source, TimeFrame::days(1), "NASDAQ:AAPL")
.with_jit(true)
.build()
.await?;with_jit 仅在 jit feature 启用时可用。若需编写同时兼容两种模式的代码,可使用条件编译:
rust
let mut builder = Instance::builder(bars, source, TimeFrame::days(1), "NASDAQ:AAPL");
#[cfg(feature = "jit")]
{
builder = builder.with_jit(true);
}
let mut instance = builder.build().await?;适用场景
JIT 在以下场景中效果最佳:
- 长历史回测 — 脚本需在数万根 bar 上运行。
- 多实例并行 — 同一实例反复重置并重新运行时,编译开销可快速摊薄。
- 计算密集型脚本 — 包含大量算术运算、循环或函数调用的脚本。
JIT 会增加 build() 的延迟。对于短脚本或 bar 数量较少的场景,构建开销可能超过执行收益。建议在生产环境启用前先进行性能分析。
平台支持
| 平台 | JIT 状态 |
|---|---|
| x86-64(Linux / macOS / Windows) | 支持 |
| AArch64(Apple Silicon、Linux ARM64) | 支持 |
| 其他架构 | 回退到解释器 |
在不支持的架构上,with_jit(true) 为空操作,执行将透明地回退到解释器。
基准测试快照
下面这组数字来自当前机器上使用仓库自带 benchmark 工具得到的实测结果:
- CPU:12th Gen Intel(R) Core(TM) i9-12900K
- 构建配置:release
- 脚本:
website/naviscripts/indicators/SimpleMovingAverage.nvs - 负载:100 个实例 x 100,000 根 bar
- 指标:
bench.rs输出里的Run time/Bars/sec(不包含 init/build 时间)
使用命令:
bash
cargo run --release -p rust-examples --bin bench -- website/naviscripts/indicators/SimpleMovingAverage.nvs
cargo run --release -p rust-examples --features jit --bin bench -- website/naviscripts/indicators/SimpleMovingAverage.nvs| 模式 | 非 JIT 运行时间 | JIT 运行时间 | 加速比 | 非 JIT bars/sec | JIT bars/sec |
|---|---|---|---|---|---|
| Stream | 44.58s | 39.34s | 1.13x | 224,298 | 254,171 |
| Chart | 43.18s | 38.65s | 1.12x | 231,609 | 258,765 |
这次运行观测到的 RSS:
| 模式 | 非 JIT 最终 RSS | JIT 最终 RSS |
|---|---|---|
| Stream | 23.9 MB | 54.3 MB |
| Chart | 1351.6 MB | 1389.0 MB |
这些数字只能作为一次实测参考,不是性能保证。实际收益会受到脚本结构、bar 数量、实例数量、分配器行为,以及你的工作负载是更偏 build 还是更偏 execution 的影响。对这个脚本来说,JIT 主要带来的是适度的执行吞吐提升,并没有降低 chart 模式的内存占用。
下一步
- 集成概述 — 集成指南完整主题汇总