4 个版本
使用旧的 Rust 2015
0.0.4 | 2019 年 11 月 15 日 |
---|---|
0.0.3 | 2016 年 11 月 3 日 |
0.0.2 | 2016 年 9 月 13 日 |
0.0.1 | 2016 年 9 月 13 日 |
#86 在 性能分析 中
2,344 每月下载量
在 17 crates 中使用
98KB
111 行
CPU 分析器
此库提供了对 Google 的 cpuprofiler 的绑定。
为什么使用这个?
还有其他 Rust 的性能分析工具,cargo-profiler 特别不错!这个库当然不能替代那些工具,但它为工具组合添加了一些不同的工具
安装
为了使用这个库,您需要安装 gperftools。在其仓库中有相应的说明,但大致如下
- 从 发布版 下载软件包
- 运行
./configure
- 运行
make install
- 运行
sudo ldconfig
可能还有您系统的一些其他依赖项 - 这些在他们的 INSTALL 文档中有很好的说明。例如,对于 64 位系统需要 libunwind (> 0.99.0)。
使用方法
将 cpuprofiler
添加到您的 Cargo.toml
清单中。
[dependencies]
cpuprofiler = "0.0.4"
将依赖关系添加到您的根目录
extern crate cpuprofiler;
在您想获取样本的代码周围启动和停止分析器。这将保存到您指定的文件中。
use cpuprofiler::PROFILER;
PROFILER.lock().unwrap().start("./my-prof.profile").unwrap();
// Code you want to sample goes here!
PROFILER.lock().unwrap().stop().unwrap();
现在您可以像平常一样运行代码。完成后,分析将保存在 ./my-prof.profile
。
最后一步是分析,这是最有意思的部分!
分析分析
要分析分析,我们使用 Google 的 pprof 工具。
此工具的旧版本包含在gperftools软件包中。这是我一直在使用的版本,但较新的Go版本也应该可以工作!在cpuprofiler文档中详细介绍了pprof的使用方法。
结果
输出格式完全取决于pprof,但这里有一些来自Rust程序的示例
文本
Total: 855 samples
207 24.2% 24.2% 207 24.2% matrixmultiply::gemm::masked_kernel::hfdb4f50027c4d91c
156 18.2% 42.5% 853 99.8% _$LT$rusty_machine..learning..optim..grad_desc..StochasticGD$u20$as$u20$rusty_machine..learning..optim..OptimAlgorithm$LT$M$GT$$GT$::optimize::h2cefcdfbe42a4db8
79 9.2% 51.7% 79 9.2% _$LT$$RF$$u27$a$u20$rulinalg..vector..Vector$LT$T$GT$$u20$as$u20$core..ops..Mul$LT$T$GT$$GT$::mul::h21ce4ecb4bbcb555
66 7.7% 59.4% 73 8.5% __ieee754_exp_sse2
61 7.1% 66.5% 95 11.1% _$LT$rusty_machine..learning..toolkit..regularization..Regularization$LT$T$GT$$GT$::l2_reg_grad::h4dff2e22567a587e
57 6.7% 73.2% 274 32.0% matrixmultiply::gemm::dgemm::h2d985771431fcfd4
41 4.8% 78.0% 42 4.9% _$LT$rulinalg..matrix..Matrix$LT$T$GT$$GT$::transpose::h736b18b122958bcd
31 3.6% 81.6% 32 3.7% sdallocx
第一列是每个函数的样本数量。第二列是直接在此函数中找到的样本的百分比,第三列是在此函数或其子函数中的样本的百分比。我想...
Graphviz
以下是交互式图形输出的片段。
上面的图形是由pprof生成的,显示了样本属于哪个函数。在上面的示例中,我们看到compute_grad
函数中有513个样本,其中119个是矩阵乘法。
待办事项
- 更好的crate文档
- 公开来自google的cpuprofiler的其他函数。这允许更多的选项,状态检查等等。
- 我们能否用Rust编写一个采样分析器?!
- 与cargo-profiler集成?
许可证
此项目采用BSD许可证以匹配gperftools许可证。这看起来很有道理,不是吗?
依赖关系
~2.6–3.5MB
~74K SLoC