1 个不稳定版本

使用旧的 Rust 2015

0.2.0 2019年2月20日

#158性能分析

Download history 131/week @ 2024-03-13 176/week @ 2024-03-20 196/week @ 2024-03-27 223/week @ 2024-04-03 142/week @ 2024-04-10 136/week @ 2024-04-17 166/week @ 2024-04-24 160/week @ 2024-05-01 202/week @ 2024-05-08 199/week @ 2024-05-15 212/week @ 2024-05-22 186/week @ 2024-05-29 194/week @ 2024-06-05 169/week @ 2024-06-12 160/week @ 2024-06-19 161/week @ 2024-06-26

723 每月下载次数
用于 13 个软件包(12 个直接使用)

BSD-2-Clause 许可

100KB
216

Rust 的 Gperftools

此代码是 AtheMathmo/cpuprofiler 的工作扩展 AtheMathmo/cpuprofiler

此库提供对 Google 的 gperftools 的绑定。

为什么使用这个?

还有其他 Rust 的性能分析工具,cargo-profiler 尤其出色!这个库当然不能取代那些工具,但为工具组合增加了不同的工具

  • 可以轻松分析代码的特定部分。
  • 使用统计抽样,这意味着开销低。
  • 支持多种输出格式的 pprof
  • 开箱即用支持内存分析(在 Linux 和 macOS 上)。

安装

为了使用此库,您需要安装 gperftools。他们的仓库中有说明,但大致步骤如下

  1. 发布 下载软件包
  2. 运行 ./configure
  3. 运行 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

以下是交互式图形输出的一个片段。

Function call graph

上面的图表由 pprof 生成,显示样本属于哪个函数。在上面的例子中,我们看到有 513 个样本在compute_grad函数中,其中有 119 个是矩阵乘法。

待办事项

  • 更好的 crate 文档
  • 公开其他函数

许可证

本项目采用 BSD 许可证以与 gperftools 许可证相匹配。这很有意义,我认为?

依赖项

~2.5–3.5MB
~74K SLoC