Skip to content

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/secJIT bars/sec
Stream44.58s39.34s1.13x224,298254,171
Chart43.18s38.65s1.12x231,609258,765

这次运行观测到的 RSS:

模式非 JIT 最终 RSSJIT 最终 RSS
Stream23.9 MB54.3 MB
Chart1351.6 MB1389.0 MB

这些数字只能作为一次实测参考,不是性能保证。实际收益会受到脚本结构、bar 数量、实例数量、分配器行为,以及你的工作负载是更偏 build 还是更偏 execution 的影响。对这个脚本来说,JIT 主要带来的是适度的执行吞吐提升,并没有降低 chart 模式的内存占用。

下一步

基于 MIT 许可证发布。