依赖Polars的小型Rust代码编译耗时过长,求排查原因
我在Windows的WSL环境下用VSCode和rust-analyzer开发一个仅含main.rs的小型Rust项目,依赖Polars库,但每次微小修改后编译耗时长达5-7分钟。
我的main.rs内容:
use polars::prelude::*; fn main() { println!("Hello, world!"); let s: Series = Series::new("employees", &vec!["Mahmoud", "Barak", "Ferris"]); println!("{:?}", s.reverse()); }
Cargo.toml中Polars的依赖配置:
[package] name = "barak_test" version.workspace = true authors.workspace = true edition.workspace = true homepage.workspace = true repository.workspace = true license.workspace = true [dependencies] polars = { path = "../../crates/polars", features = ["lazy", "csv", "ipc"] }
已关闭rust-analyzer.checkOnSave,编译日志显示仅我的项目被重新编译,但耗时依旧很长:
warning: unused import: `coerce::*` --> crates/polars-plan/src/dsl/functions/mod.rs:19:9 | 19 | pub use coerce::*; | ^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default warning: unused import: `index::*` --> crates/polars-plan/src/dsl/functions/mod.rs:24:9 | 24 | pub use index::*; | ^^^^^^^^ warning: unused variable: `expr_arena` --> crates/polars-plan/src/logical_plan/optimizer/predicate_pushdown/utils.rs:151:5 | 151 | expr_arena: &Arena<AExpr>, | ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_expr_arena` | = note: `#[warn(unused_variables)]` on by default warning: `polars-plan` (lib) generated 3 warnings (run `cargo fix --lib -p polars-plan` to apply 3 suggestions) Compiling barak_test v0.35.4 (/mnt/d/PycharmProjects/polars/examples/barak_test) Finished dev [unoptimized + debuginfo] target(s) in 7m 21s
补充:使用cargo build --timings仅显示总时间,生成的图表为空。
可能的原因分析
WSL文件系统性能瓶颈:项目放在WSL挂载的Windows磁盘(
/mnt/d/)上,WSL对NTFS等Windows文件系统的文件访问性能远低于Linux原生文件系统。编译过程中频繁读写大量中间文件(如依赖缓存、编译输出),慢IO会大幅拖长整体耗时。本地Polars依赖的缓存校验开销:由于使用本地路径依赖Polars工作区,Cargo每次编译都会检查Polars所有子crate的状态,哪怕这些子crate没有变更,也会触发依赖关系重新解析、缓存有效性校验等操作,额外消耗时间。
后台进程资源抢占:即使关闭了
checkOnSave,rust-analyzer仍可能在后台进行代码索引、类型分析等操作,占用WSL的CPU或内存资源,导致编译过程资源不足,速度变慢。可以尝试关闭VSCode后用终端直接运行cargo build验证。特性集导致链接阶段缓慢:启用的
lazy、csv、ipc等特性引入了大量依赖库,即使项目代码量小,链接阶段需要处理的符号数量极多,而WSL的链接性能本身弱于原生Linux环境,这部分耗时占比可能极高。Cargo工具兼容性问题:
cargo build --timings图表为空,可能是WSL环境下日志输出缓冲异常,或是Cargo版本与WSL存在兼容性问题,间接反映环境存在影响编译效率的异常。
内容的提问来源于stack exchange,提问作者barak1412

