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 許可證發佈。