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 日

56Cargo 插件 中排名

Download history 314/week @ 2024-05-03 125/week @ 2024-05-10 406/week @ 2024-05-17 92/week @ 2024-05-24 77/week @ 2024-05-31 107/week @ 2024-06-07 91/week @ 2024-06-14 74/week @ 2024-06-21 80/week @ 2024-06-28 73/week @ 2024-07-05 56/week @ 2024-07-12 66/week @ 2024-07-19 103/week @ 2024-07-26 78/week @ 2024-08-02 60/week @ 2024-08-09 39/week @ 2024-08-16

295 每月下载量

MIT/Apache

30KB
642

cargo-llvm-lines

github crates.io build status

此工具测量程序中每个泛型函数实例的数量和大小,指示代码的哪些部分在提高编译指标方面具有最高杠杆作用。

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

每行一个函数,有三列输出

  1. 函数所有实例中生成的 LLVM IR 的行数总和(加上总和的百分比以及迄今为止所有函数的累积百分比)。
  2. 函数的实例化数量(加上总和的百分比以及迄今为止所有函数的累积百分比)。对于泛型函数,实例化数量大致等于它被调用的泛型类型参数的不同组合的数量。
  3. 函数的名称。

多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.0MIT license
除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交的任何贡献,均应双重许可,如上所述,无需附加条款或条件。

依赖项

~5–15MB
~205K SLoC