7 个版本

使用旧的 Rust 2015

0.1.6 2016年6月1日
0.1.5 2016年5月24日

341Cargo 插件 中排名

Download history 37/week @ 2024-03-11 23/week @ 2024-03-18 12/week @ 2024-03-25 37/week @ 2024-04-01 23/week @ 2024-04-08 12/week @ 2024-04-15 27/week @ 2024-04-22 36/week @ 2024-04-29 7/week @ 2024-05-06 10/week @ 2024-05-13 13/week @ 2024-05-20 22/week @ 2024-05-27 18/week @ 2024-06-03 10/week @ 2024-06-10 40/week @ 2024-06-17 21/week @ 2024-06-24

每月 91 次下载

Apache-2.0

48KB
912

Build Status

cargo-profiler

Cargo 子命令用于分析二进制文件。

近期更改

  • 0.1.6 - 可以提供二进制参数。
  • 0.1.5 - 修复错误
  • 0.1.4 - 检测到 rust 项目外的调用。将 valgrind 内存错误传播到 cargo 性能分析器。将进程退出/打印错误函数移动到 main.rs 中,以便我们可以为底层函数创建单元测试。这是通过 main.rs 中的 try_or_exit 宏实现的。一般而言,使用 result/option 组合器(例如 and_then、ok_or 等)有更好的错误处理。每个子模块初始化单元测试。
  • 0.1.3 - 更好地集成 cargo。如果项目中存在 cargo.toml,则不再需要指定二进制文件。更好的错误消息和退出(例如,编译错误时)。

安装方法

注意:此子命令只能在 Linux 机器上使用。

首先安装 valgrind

$ sudo apt-get install valgrind

cargo install

或者,您可以克隆此存储库,并从源代码构建二进制文件。

$ cargo build --release

现在,将构建的二进制文件复制到 cargo 的同一目录。

$ sudo cp ./target/release/cargo-profiler $(dirname $(which cargo))/

运行方法

Cargo 性能分析器目前支持 callgrind 和 cachegrind。

您可以在具有 Cargo.toml 的 rust 项目目录中的任何位置调用 cargo 性能分析器。

$ cargo profiler callgrind
$ cargo profiler cachegrind --release

您也可以直接指定一个二进制文件

$ cargo profiler callgrind --bin $PATH_TO_BINARY

要指定正在分析的可执行文件的命令行参数,请在后面追加它们

$ cargo profiler callgrind --bin $PATH_TO_BINARY -- -a 3 --like this

您可以限制要查看的函数数量

$ cargo profiler callgrind --bin ./target/debug/rsmat -n 10

Profiling rsmat with callgrind...

Total Instructions...198,466,456

78,346,775 (39.5%) dgemm_kernel.rs:matrixmultiply::gemm::masked_kernel
-----------------------------------------------------------------------
23,528,320 (11.9%) iter.rs:_..std..ops..Range..A....as..std..iter..Iterator..::next
-----------------------------------------------------------------------
16,824,925 (8.5%) loopmacros.rs:matrixmultiply::gemm::masked_kernel
-----------------------------------------------------------------------
10,236,864 (5.2%) mem.rs:core::mem::swap
-----------------------------------------------------------------------
7,712,846 (3.9%) memset.S:memset
-----------------------------------------------------------------------
7,197,344 (3.6%) ???:core::cmp::impls::_..impl..cmp..PartialOrd..for..usize..::lt
-----------------------------------------------------------------------
6,979,680 (3.5%) ops.rs:_..usize..as..ops..Add..::add
-----------------------------------------------------------------------

使用 cachegrind,您还可以按特定指标列排序数据

$ cargo profiler cachegrind --bin ./target/debug/rsmat -n 10 --sort dr

Profiling rsmat with cachegrind...

Total Memory Accesses...320,385,356

Total L1 I-Cache Misses...371 (0%)
Total LL I-Cache Misses...308 (0%)
Total L1 D-Cache Misses...58,549 (0%)
Total LL D-Cache Misses...8,451 (0%)

 Ir  I1mr ILmr  Dr  D1mr DLmr  Dw  D1mw DLmw
0.40 0.18 0.21 0.35 0.93 1.00 0.38 0.00 0.00 dgemm_kernel.rs:matrixmultiply::gemm::masked_kernel
-----------------------------------------------------------------------
0.08 0.04 0.05 0.12 0.00 0.00 0.02 0.00 0.00 loopmacros.rs:matrixmultiply::gemm::masked_kernel
-----------------------------------------------------------------------
0.12 0.02 0.02 0.10 0.00 0.00 0.15 0.00 0.00 iter.rs:_std..ops..RangeAasstd..iter..Iterator::next
-----------------------------------------------------------------------
0.05 0.01 0.01 0.07 0.00 0.00 0.08 0.00 0.00 mem.rs:core::mem::swap
-----------------------------------------------------------------------
0.03 0.00 0.00 0.05 0.00 0.00 0.00 0.00 0.00 ???:core::cmp::impls::_implcmp..PartialOrdforusize::lt
-----------------------------------------------------------------------
0.03 0.01 0.01 0.04 0.00 0.00 0.03 0.00 0.00 ops.rs:_busizeasops..Addausize::add
-----------------------------------------------------------------------
0.04 0.01 0.01 0.04 0.00 0.00 0.03 0.00 0.00 ptr.rs:core::ptr::_implconstT::offset
-----------------------------------------------------------------------
0.02 0.01 0.00 0.03 0.00 0.00 0.01 0.00 0.00 ???:_usizeasops..Add::add
-----------------------------------------------------------------------
0.01 0.01 0.01 0.02 0.00 0.00 0.01 0.00 0.00 mem.rs:core::mem::uninitialized
-----------------------------------------------------------------------
0.02 0.01 0.01 0.02 0.00 0.00 0.04 0.00 0.00 wrapping.rs:_XorShiftRngasRng::next_u32
-----------------------------------------------------------------------


cachegrind 指标是什么?

  • Ir -> 总指令数
  • I1mr -> Level 1 I-Cache 缺失
  • ILmr -> 最后一级 I-Cache 缺失
  • Dr -> 总内存读取
  • D1mr -> Level 1 D-Cache 读取缺失
  • DLmr -> 最后一级 D-cache 读取缺失
  • Dw -> 总内存写入
  • D1mw -> Level 1 D-Cache 写入缺失
  • DLmw -> 最后一级 D-cache 写入缺失

待办事项

  • cmp 子命令 - 比较二进制分析结果
  • 性能分析器宏
  • 关于昂贵函数的更好上下文
  • 支持更多分析工具

依赖关系

~6.5MB
~120K SLoC