50 个版本
0.4.39 | 2024 年 5 月 17 日 |
---|---|
0.4.37 | 2024 年 4 月 6 日 |
0.4.36 | 2023 年 10 月 13 日 |
0.4.32 | 2023 年 7 月 29 日 |
0.1.1 | 2017 年 11 月 30 日 |
56 在 Cargo 插件 中排名
295 每月下载量
30KB
642 行
cargo-llvm-lines
此工具测量程序中每个泛型函数实例的数量和大小,指示代码的哪些部分在提高编译指标方面具有最高杠杆作用。
Rust 中的泛型函数可以多次实例化,因此它们可以不成比例地影响编译时间、编译器的内存使用和编译可执行文件的大小。
安装
使用 cargo install cargo-llvm-lines
安装。
输出
在运行 cargo llvm-lines
的代码库上运行的示例输出
$ cargo llvm-lines | head -20
Lines Copies Function name
----- ------ -------------
51637 1222 (TOTAL)
2240 (4.3%, 4.3%) 1 (0.1%, 0.1%) <cargo_llvm_lines::opts::LlvmLines as clap_builder::derive::Args>::augment_args
1190 (2.3%, 6.6%) 1 (0.1%, 0.2%) <cargo_llvm_lines::opts::LlvmLines as clap_builder::derive::FromArgMatches>::from_arg_matches_mut
1005 (1.9%, 8.6%) 3 (0.2%, 0.4%) alloc::raw_vec::RawVec<T,A>::grow_amortized
973 (1.9%, 10.5%) 7 (0.6%, 1.0%) clap_builder::parser::matches::arg_matches::ArgMatches::try_remove_arg_t
939 (1.8%, 12.3%) 7 (0.6%, 1.6%) alloc::sync::Arc<T>::try_unwrap
935 (1.8%, 14.1%) 6 (0.5%, 2.0%) <alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter
861 (1.7%, 15.8%) 7 (0.6%, 2.6%) alloc::sync::Arc<dyn core::any::Any+core::marker::Send+core::marker::Sync>::downcast
761 (1.5%, 17.2%) 5 (0.4%, 3.0%) alloc::vec::Vec<T,A>::extend_desugared
638 (1.2%, 18.5%) 1 (0.1%, 3.1%) cargo_llvm_lines::table::print
599 (1.2%, 19.6%) 16 (1.3%, 4.4%) core::option::Option<T>::ok_or_else
592 (1.1%, 20.8%) 2 (0.2%, 4.6%) core::slice::sort::merge
574 (1.1%, 21.9%) 2 (0.2%, 4.7%) core::slice::sort::merge_sort
561 (1.1%, 23.0%) 7 (0.6%, 5.3%) clap_builder::parser::matches::any_value::AnyValue::downcast_into
556 (1.1%, 24.1%) 4 (0.3%, 5.6%) <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::next
541 (1.0%, 25.1%) 16 (1.3%, 7.0%) core::option::Option<T>::map
536 (1.0%, 26.1%) 8 (0.7%, 7.6%) <alloc::sync::Weak<T> as core::ops::drop::Drop>::drop
533 (1.0%, 27.2%) 1 (0.1%, 7.7%) core::str::pattern::simd_contains
每行一个函数,有三列输出
- 函数所有实例中生成的 LLVM IR 的行数总和(加上总和的百分比以及迄今为止所有函数的累积百分比)。
- 函数的实例化数量(加上总和的百分比以及迄今为止所有函数的累积百分比)。对于泛型函数,实例化数量大致等于它被调用的泛型类型参数的不同组合的数量。
- 函数的名称。
多crate 项目
在存在多个 crate 和泛型的情况下解释输出可能很复杂。 cargo llvm-lines
只显示根 crate 的贡献;不包含依赖项。要评估中间 crate 的贡献,请使用 -p
标志。
$ cargo llvm-lines -p some-dependency
但是请注意,Rust 泛型是单态化的——泛型函数将在使用它的 crate 中进行计数,而不是在定义它的 crate 中。
有一个技巧可以获得全面视角:启用链接时间优化会导致所有代码生成都在根crate中进行。因此,您可以使用以下调用获得完整视图
$ CARGO_PROFILE_RELEASE_LTO=fat cargo llvm-lines --release
致谢
基于 @eddyb 关于如何计数单形化函数以调试编译器内存使用、可执行文件大小和编译时间的建议。
<eddyb>未优化的LLVM IR
<eddyb>首先使用grep '^define' 仅获取定义函数体的行
<eddyb>然后在编辑器中使用正则表达式替换,删除@之前和(之后的所有内容
<eddyb>然后排序 | uniq -c
许可
根据您的选择,在以下任一许可下获得许可:Apache License, Version 2.0 或 MIT license。除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交的任何贡献,均应双重许可,如上所述,无需附加条款或条件。
依赖项
~5–15MB
~205K SLoC