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性能分析

Download history 622/week @ 2024-03-13 701/week @ 2024-03-20 541/week @ 2024-03-27 690/week @ 2024-04-03 489/week @ 2024-04-10 548/week @ 2024-04-17 572/week @ 2024-04-24 479/week @ 2024-05-01 638/week @ 2024-05-08 540/week @ 2024-05-15 475/week @ 2024-05-22 489/week @ 2024-05-29 496/week @ 2024-06-05 522/week @ 2024-06-12 629/week @ 2024-06-19 600/week @ 2024-06-26

2,344 每月下载量
17 crates 中使用

BSD-2-Clause 协议

98KB
111

CPU 分析器

此库提供了对 Google 的 cpuprofiler 的绑定。

为什么使用这个?

还有其他 Rust 的性能分析工具,cargo-profiler 特别不错!这个库当然不能替代那些工具,但它为工具组合添加了一些不同的工具

  • 可以轻松分析代码的特定部分
  • 使用统计采样(如 oprofiler),这意味着开销低
  • pprof 一起工作,支持多种输出格式

安装

为了使用这个库,您需要安装 gperftools。在其仓库中有相应的说明,但大致如下

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

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

Function call graph

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

待办事项

  • 更好的crate文档
  • 公开来自google的cpuprofiler的其他函数。这允许更多的选项,状态检查等等。
  • 我们能否用Rust编写一个采样分析器?!
  • 与cargo-profiler集成?

许可证

此项目采用BSD许可证以匹配gperftools许可证。这看起来很有道理,不是吗?

依赖关系

~2.6–3.5MB
~74K SLoC