1 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2019年2月20日 |
---|
#158 在 性能分析 中
723 每月下载次数
用于 13 个软件包(12 个直接使用)
100KB
216 行
Rust 的 Gperftools
此代码是 AtheMathmo/cpuprofiler 的工作扩展 AtheMathmo/cpuprofiler。
此库提供对 Google 的 gperftools 的绑定。
为什么使用这个?
还有其他 Rust 的性能分析工具,cargo-profiler 尤其出色!这个库当然不能取代那些工具,但为工具组合增加了不同的工具
- 可以轻松分析代码的特定部分。
- 使用统计抽样,这意味着开销低。
- 支持多种输出格式的 pprof。
- 开箱即用支持内存分析(在 Linux 和 macOS 上)。
安装
为了使用此库,您需要安装 gperftools。他们的仓库中有说明,但大致步骤如下
- 从 发布 下载软件包
- 运行
./configure
- 运行
make install
您的系统可能需要一些其他依赖项 - 他们在 INSTALL 文档中有很好的解释。例如,64 位系统需要 libunwind (> 0.99.0)。
用法
将 gperftools
添加到您的 Cargo.toml
清单中。
[dependencies]
gperftools = "0.1.0"
将依赖项添加到根目录
extern crate gperftools;
在您想要收集样本的代码周围启动和停止分析器。这将保存到您指定的文件中。
// CPU
use gperftools::profiler::PROFILER;
PROFILER.lock().unwrap().start("./my-prof.prof").unwrap();
// Code you want to sample goes here!
PROFILER.lock().unwrap().stop().unwrap();
// HEAP
use gperftools::heap_profiler::HEAP_PROFILER;
HEAP_PROFILER.lock().unwrap().start("./my-prof.hprof").unwrap();
// Code you want to sample goes here!
HEAP_PROFILER.lock().unwrap().stop().unwrap();
现在您可以像平常一样运行代码。完成后,分析将保存到 ./my-prof.prof
。
最后一步是分析!
堆分析
要使用堆分析器,需要使用自定义分配器。此功能需要设置功能 heap
,以启用它。启用后,全局分配器将更改为使用 tcmalloc,这是 gperftools 分析分配所必需的。
您可以在这里找到有关堆分析的其他文档。
分析配置文件
要分析配置文件,请使用 Google 的pprof工具。
您可以在这里找到有关如何使用 gperftools 的文档。
如果您遇到符号未显示的问题,请确保
- 您已启用调试符号(
RUSTFLAGS=-g
) llvm-symbolize
在您的路径中
结果
输出格式完全取决于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 生成,显示样本属于哪个函数。在上面的例子中,我们看到有 513 个样本在compute_grad
函数中,其中有 119 个是矩阵乘法。
待办事项
- 更好的 crate 文档
- 公开其他函数
许可证
本项目采用 BSD 许可证以与 gperftools 许可证相匹配。这很有意义,我认为?
依赖项
~2.5–3.5MB
~74K SLoC