7 个版本
使用旧的 Rust 2015
0.1.6 | 2016年6月1日 |
---|---|
0.1.5 | 2016年5月24日 |
341 在 Cargo 插件 中排名
每月 91 次下载
48KB
912 行
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