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 模式的記憶體占用。
下一步
- 整合概述 — 整合指南完整主題彙總