如何使用谷歌性能工具

2024-03-09

我刚刚开始使用谷歌性能工具(google-perftools and libgoogle-perftools4ubuntu 中的软件包),我发誓我在谷歌上搜索了大约一天,但没有找到答案! 问题是我没有通过 CPU 分析获得所有函数的结果。这是我的代码:

#include "gperftools/profiler.h"
#include <iostream>
#include <math.h>
using namespace std;
void bar()
{
        int a,b,c,d,j,k;
        a=0;
        int z=0;
        b = 1000;
        while(z < b)
        {
                while (a < b)
                {
                        d = sin(a);
                        c = cos(a);
                        j = tan(a);
                        k = tan(a);
                        k = d * c + j *k;
                        a++;
                }
                a = 0;
                z++;
        }
}
void foo()
{
        cout << "hey " << endl;
}

int main()
{
        ProfilerStart("/home/mohammad/gperf/dump.txt");

        int a = 1000;
        while(a--){foo();}
        bar();
        ProfilerFlush();
        ProfilerStop();
}

编译为g++ test.cc -lprofiler -o a.out

这就是我运行代码的方式:

CPUPROFILE=dump.txt ./a.out

我也尝试过这个:

CPUPROFILE_FREQUENCY=10000 LD_PRELOAD=/usr/local/lib/libprofiler.so.0.3.0 CPUPROFILE=dump.txt ./a.out

这就是我从中得到的google-pprof --text a.out dump.txt:

Using local file ./a.out.
Using local file ./dump.txt.
Total: 22 samples
8  36.4%  36.4%        8  36.4% 00d8cb04
6  27.3%  63.6%        6  27.3% bar
3  13.6%  77.3%        3  13.6% __cos (inline)
2   9.1%  86.4%        2   9.1% 00d8cab4
1   4.5%  90.9%        1   4.5% 00d8cab6
1   4.5%  95.5%        1   4.5% 00d8cb06
1   4.5% 100.0%        1   4.5% __write_nocancel
0   0.0% 100.0%        3  13.6% __cos

但是没有关于 foo 函数的信息!

我的系统信息: ubuntu 12.04 克++4.6.3

就这样!


TL;DR: foo为了获得分析事件又快又小,请再运行 100 次。频率设置有拼写错误,并且pprof采样频率不会高于 CONFIG_HZ(通常为 250)。最好切换到更现代的 Linuxperf分析器(作者的教程 https://perf.wiki.kernel.org/index.php/Tutorial, 维基百科 http://en.wikipedia.org/wiki/Perf_%28Linux%29).

长版:

Your foo函数太短太简单了——只调用两个函数。编译测试g++ test.cc -lprofiler -o test.s -S -g,过滤为test.s with c++filt使 C++ 名称可读的程序:

foo():
.LFB972:
        .loc 1 27 0
        pushq   %rbp
        movq    %rsp, %rbp
        .loc 1 28 0
        movl    $.LC0, %esi
        movl    std::cout, %edi
        call    std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
        movl    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&), %esi
        movq    %rax, %rdi
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
        .loc 1 29 0
        popq    %rbp
        ret
.LFE972:
        .size   foo(), .-foo()

因此,要在配置文件中查看它,您应该运行foo更多次,改变int a = 1000;主要是更大的东西,比如 10000 或更好的 100000(就像我在测试中所做的那样)。

您也可以修复不正确的“CPUPROFILE_FREQUENC=10000“ 纠正CPUPROFILE_FREQUENCY(注意Y)。我应该说 CPUPROFILE_FREQUENCY 的 10000 设置太高,因为它通常每秒只能生成 1000 或 250 个事件,具体取决于内核配置CONFIG_HZ(大多数 3.x 内核有 250 个,检查grep CONFIG_HZ= /boot/config*)。 pprof 中 CPUPROFILE_FREQUENCY 的默认设置为 100。

我在 Ubuntu 14.04 上使用 bash 脚本测试了 CPUPROFILE_FREQUENCY 的不同值:100000、10000、1000、250

for a in 100000 100000 10000 10000 1000 1000 300 300 250 250; do 
   echo -n "$a "; 
   CPUPROFILE_FREQUENCY=$a CPUPROFILE=dump$a.txt ./test >/dev/null;
done

结果是相同的 120-140 个事件,每个 ./test 的运行时间约为 0.5 秒,因此来自 google-perftools 的 cpuprofiler 无法为单线程每秒执行比内核中设置的 CONFIG_HZ 更多的事件(我的有 250 个)。

100000 PROFILE: interrupts/evictions/bytes = 124/1/6584
100000 PROFILE: interrupts/evictions/bytes = 134/0/7864
10000 PROFILE: interrupts/evictions/bytes = 125/0/7488
10000 PROFILE: interrupts/evictions/bytes = 123/0/6960
1000 PROFILE: interrupts/evictions/bytes = 134/0/6264
1000 PROFILE: interrupts/evictions/bytes = 125/2/7272
300 PROFILE: interrupts/evictions/bytes = 137/2/7984
300 PROFILE: interrupts/evictions/bytes = 126/0/7216
250 PROFILE: interrupts/evictions/bytes = 123/3/6680
250 PROFILE: interrupts/evictions/bytes = 137/2/7352

原始a=1000foo并且 cout 的函数运行得太快,无法在每次运行中获取任何分析事件(即使是 250 个事件/秒),因此您没有foo,也没有任何输入/输出功能。在少量运行中,__write_nocancel可能会得到采样事件,然后foo将报告 libstdc++ 形式的 I/O 函数(不在最顶部的某个位置,因此使用--text的选项pprof or google-pprof),自事件计数为零,子事件计数非零:

 ....
   1   0.9%  99.1%        1   0.9% __write_nocancel
 ....
   0   0.0% 100.0%        1   0.9% _IO_new_file_overflow
   0   0.0% 100.0%        1   0.9% _IO_new_file_write
   0   0.0% 100.0%        1   0.9% __GI__IO_putc
   0   0.0% 100.0%        1   0.9% foo
   0   0.0% 100.0%        1   0.9% new_do_write
   0   0.0% 100.0%        1   0.9% std::endl
   0   0.0% 100.0%        1   0.9% std::ostream::put

With a=100000, foo 仍然太短太快,无法获取自己的事件,但 I/O 函数有几个。这是我长时间抓取的列表--text output:

  34  24.6%  24.6%       34  24.6% __write_nocancel

   1   0.7%  95.7%       35  25.4% __GI__IO_fflush
   1   0.7%  96.4%        1   0.7% __GI__IO_putc
   1   0.7%  97.8%        2   1.4% std::operator<< 
   1   0.7%  98.6%       36  26.1% std::ostream::flush
   1   0.7%  99.3%        2   1.4% std::ostream::put
   0   0.0% 100.0%       34  24.6% _IO_new_file_sync
   0   0.0% 100.0%       34  24.6% _IO_new_file_write
   0   0.0% 100.0%       40  29.0% foo

   0   0.0% 100.0%       34  24.6% new_do_write

   0   0.0% 100.0%        2   1.4% std::endl

拥有零计数器的函数只能通过以下方式才能看到pprof读取调用链的能力(如果不省略帧信息,它知道谁调用了获取样本的函数)。

我还可以推荐更现代、更强大(软件和硬件事件,高达 5 kHz 频率或更高;用户空间和内核分析)和更好支持的分析器,Linuxperf分析器(作者的教程 https://perf.wiki.kernel.org/index.php/Tutorial, 维基百科 http://en.wikipedia.org/wiki/Perf_%28Linux%29).

有结果来自perf with a=10000:

$ perf record  ./test3  >/dev/null
 ... skip some perf's spam about inaccessibility of kernel symbols 
 ... note the 3 kHz frequency here VVVV
Lowering default frequency rate to 3250. 
Please consider tweaking /proc/sys/kernel/perf_event_max_sample_rate.
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.078 MB perf.data (~3386 samples) ]

查看文本报告perf.data输出文件我会少用(因为perf report默认情况下启动交互式配置文件浏览器):

$ perf report |less
... skip some extra info about the machine, kernel, and perf starting command
# Samples: 1K of event 'cycles'
# Event count (approx.): 1155264208
# Overhead   Command   Shared Object          Symbol
    41.94%    test3  libm-2.19.so         [.] __tan_sse2                                                                                                                                                                    
    16.95%    test3  libm-2.19.so         [.] __sin_sse2    
    13.40%    test3  libm-2.19.so         [.] __cos_sse2                                                                                                                                                                    
     4.93%    test3  test3                [.] bar()                                                                                                                                                                         
     2.90%    test3  libc-2.19.so         [.] __GI___libc_write    
....
     0.20%    test3  test3                [.] foo()                                                                                                                                                                         

Or perf report -n | less查看原始事件(示例)计数器:

# Overhead       Samples  Command        Shared Object 
    41.94%           663    test3  libm-2.19.so         [.] __tan_sse2                                                                                                                                                                    
    16.95%           268    test3  libm-2.19.so         [.] __sin_sse2   
    13.40%           212    test3  libm-2.19.so         [.] __cos_sse2                                                                                                                                                                    
     4.93%            78    test3  test3                [.] bar()                                                                                                                                                                         
     2.90%            62    test3  libc-2.19.so         [.] __GI___libc_write     
 ....
     0.20%             4    test3  test3                [.] foo()                                                                                                                                                                         
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用谷歌性能工具 的相关文章

  • 使用 __gnu_mcount_nc 捕获函数退出时间

    我正在尝试在支持不佳的原型嵌入式平台上进行一些性能分析 我注意到 GCC 的 pg 标志导致 thunks gnu mcount nc在每个函数的入口处插入 没有实施 gnu mcount nc是可用的 并且供应商没有兴趣提供帮助 但是由于
  • 函数分析问题 - Visual Studio 2010 Ultimate

    我正在尝试分析我的应用程序以监视重构之前和之后函数的效果 我对我的申请进行了分析 并查看了摘要 我注意到Hot Path http msdn microsoft com en us library ms182398 aspx列表没有提到我使
  • 如何分析本机 JNI 库

    如何分析用 C 编写的 Java 本机接口库 我了解常用的 C 分析器 但我的问题是如何分析whole设置包括对 JVM 方法的调用 这可能会减慢程序速度 经过对这里提出的一些方法的一些研究和测试后 我最终使用了sprof 基本上我遵循了可
  • 持续集成中的 Java 分析

    有没有像 Jenkins 这样与 CI 服务器集成的 Java 分析工具 我不知道这样的东西是否存在 但是如果有某种测试框架能够产生像 YourKit Profiler 的快照这样的结果 那就太好了 这些将由 CI 服务器调用 并将结果与
  • 调试和分析网络工作者

    我正在运行计算 例如网络工作者的寻路 这可能需要几秒钟 我想优化它 对于我当前的代码来说 Chrome 似乎快了大约 3 倍 但是时间花在哪里或者为什么我不知道 一般来说 如何调试 Web Worker 如何分析网络工作者 火狐和 Chro
  • 在大型文本文件中搜索字符串 - 分析 python 中的各种方法

    这个问题已经被问过很多次了 花了一些时间阅读答案后 我做了一些快速分析来尝试前面提到的各种方法 我有一个600 MB文件与600万字符串行 DMOZ 项目的类别路径 每行的条目都是唯一的 我想要load文件once 不停寻找用于数据中的匹配
  • 当我在模型中加载数据库时,如何在 Codeigniter Profiler 中显示数据库查询?

    我的 Codeigniter 系统使用多个数据库 我不需要每个页面上的每个数据库 因此我在需要的模型中加载每个连接 然后在每个控制器中加载所需的模型 当我以这种方式加载内容时 探查器不会显示来自这些数据库的任何查询 这是我在模型中加载数据库
  • 以编程方式查找对象使用的内存

    有没有办法以编程方式准确确定 C 中对象使用的内存量 我不关心这个过程有多慢 所以左右运行 GC 是可以接受的 当然我更喜欢更高效的东西 序列化对象并查看结果长度似乎不太准确 在对此方法的简单测试中 我看到整数返回值 54 Using GC
  • 使用 C# 驱动程序时分析 MongoDB 查询

    有没有办法记录 MongoDB C 驱动程序生成并发送到 mongodb 的实际查询 就像在 SQL Server 中一样 您可以使用 SQL Profiler 来显示所有传入的查询 您可以启用分析并按照 pingw33n 的建议在 mon
  • 读取并解析 perf.data

    我正在使用命令 perf record 记录 frm linux 的性能计数器 我想使用结果perf data作为其他编程应用程序的输入 你知道我该如何读取和解析其中的数据吗perf data 有没有办法把它改造成 text文件或 csv
  • Adobe Flash Builder 能否用于调试和分析 OpenLaszlo SWF10/SWF11 应用程序?

    我读过 Adob e 的Flash Builder 4 0 支持 ActionScript 3 的分析 http help adobe com en US flashbuilder using WS6f97d7caa66ef6eb1e63e
  • 交互式 Python:尽管正确导入了 line_profiler,但无法使 `%lprun` 工作

    Problem 大多数 iPython 神奇函数 对我来说立刻就可以正常工作 hist time prun等等 但是 我注意到 lprun无法使用 iPython 找到它 因为我最初安装了它 尝试解决 然后我发现我应该安装line prof
  • 适用于 Firefox 的 Javascript 内存分析器

    Firefox 是否有工具 插件 功能可以转储您在页面 脚本中创建的 Javascript 对象的内存使用情况 我了解 Firebug 的分析器 但我想要的不仅仅是时间 类似于 Yourkit 用于 Java 内存使用情况分析的功能 原因是
  • 针对 PyPy 进行优化

    这是后续PyPy 的统计分析器 https stackoverflow com questions 17346226 statistical profiler for pypy 我正在 PyPy 下运行一些 Python 代码 并希望对其进
  • 在 C# 中显式释放内存

    我创建了一个 C 应用程序 它使用了 150mb 内存 私有字节 主要是由于字典很大 Dictionary
  • VisualVM中的时间和时间(CPU)有什么区别

    我使用 VisualVM 来查找某个特定调用的所有时间都花在了哪里 我发现大部分时间都在数据库调用中 但是分析器显示85 的时间是java lang Object 只有15 的时间在数据库调用中 我读错了什么吗 The columns wi
  • Jprofiler Linux 上的远程分析。如何更改探查器数据文件的路径

    我正在 Linux 盒子上运行 java java 6 应用程序并进行其他设置 agentpath home myuser jprofiler bin linux x64 libjprofilerti so nowait 端口 7777 在
  • 如何离线分析使用 pstats.dump_stats(filename) 创建的文件?

    我基本上做了以下工作 import cProfile pstats StringIO pr cProfile Profile pr enable my code did something pr disable s StringIO Str
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do

随机推荐

  • CoreAnimation、AVFoundation 和视频导出功能

    我正在寻找将图片序列导出为 QuickTime 视频的正确方法 我知道 AV Foundation 能够合并或重新组合视频 还能够添加音轨来构建单个视频资产 现在 我的目标有点不同 我想从头开始创建一个视频 我有一组 UIImage 我需要
  • capistrano 部署时使用了错误版本的 Ruby

    在我使用 capistrano 部署到新服务器后 我看到 共享 捆绑 红宝石 1 9 1 gems 我什至没有在服务器上安装 ruby 1 9 1 如果我跑 ruby v它返回 1 9 3 但在所有的 capisrtano 操作中我一直看到
  • Spring、NotReadablePropertyException 和 Glassfish 版本

    我正在开发一个使用 Spring MVC 的 Web 应用程序 它在 Glassfish 3 0 1 上运行良好 但当迁移到 Glassfish 3 1 时 它开始表现得很奇怪 有些页面仅部分显示 或根本不显示任何内容 并且在日志中 有很多
  • 使用正则表达式和 bash 重命名文件[重复]

    这个问题在这里已经有答案了 可能的重复 在unix中一次重命名多个文件 https stackoverflow com questions 1086502 rename multiple files at once in unix 我想使用
  • 应用程序身份验证和应用程序用户的预期用例是什么?

    我试图了解应用程序身份验证和应用程序用户的预期用例是什么 我基本上正在考虑构建一个应用程序 该应用程序将使用 Box 来存储订阅我们服务的用户的数据 我们的服务将允许每个用户访问和查看他们的数据 如果我的帐户基本上拥有所有订阅用户的数据 我
  • 我们可以使用 Bunit 在 Blazor WebAssembly 中进行单元测试控制器吗

    我们可以使用 Bunit x 单元对 Blazor WebAssembly 中的控制器 端点进行单元测试吗 https bunit dev https bunit dev 像这样https learn microsoft com en us
  • 使用Boost.Asio获取“整个数据包”

    我有一个 TCP 客户端连接到我的服务器 它正在发送原始数据包 如何使用 Boost Asio 每次都能获取 整个 数据包 当然是异步的 假设这些数据包可以是任意大小 最多可达我的内存的完整大小 基本上 我想避免创建静态大小的缓冲区 通常
  • 何时使用 TestFixtureSetUp 属性而不是默认构造函数?

    NUnit 文档没有告诉我何时使用带有 a 的方法TestFixtureSetup以及何时在构造函数中进行设置 public class MyTest private MyClass myClass public MyTest myClas
  • webpack-dev-server 编译但不刷新我的网络浏览器

    我正在尝试使用 webpack dev server 热加载 我的 jsx 组件 这是我正在使用的命令 bin webpack dev server host 0 0 0 0 当我保存 jsx 代码时 它会有趣地进行编译 但不会通知我的开发
  • 实体类的 GetHashCode() 的正确实现是什么?

    下面是一个实体基类的重写 Object Equals 的示例实现 应用程序中的所有其他实体都派生自该实体基类 所有实体类都有 Id 属性 它是一个可为 null 的 int 它是实体类对应的任何表的主键 public override bo
  • 如何在控制器中使用辅助函数?

    我在 app helper 文件中编写了一些函数 现在我需要在我的控制器中调用该函数 我如何在 CAKEPHP 中做到这一点 你不能 如果您的函数非常通用 可以在视图之外使用 请在中创建它们bootstrap php或在中创建自定义库 类l
  • 如何让我的Python代码运行得更快

    我正在研究循环多个 netcdf 文件 大 28G 的代码 netcdf 文件在整个域中具有多个 4D 变量 时间 东西 南北 高度 目标是循环这些文件并循环域中所有这些变量的每个位置 并将某些变量存储到一个大数组中 当文件丢失或不完整时
  • 如何从 Angular 规范触发输入 onchange

    我有一个input HTML File filed
  • 尽早设置日志记录:捕获导入期间发出的警告

    我希望所有警告都按照我希望处理日志的方式进行处理 即使这些是在导入库期间发出的 这意味着必须在导入库之前完成日志记录的配置 经过一段时间的搜索后 我认为在自定义中配置日志记录sitecustomize py可能是一个解决方案 But sit
  • 向 Citrix 会话发送消息

    我有在本地和 Citrix 会话上运行的程序 我需要以非常可靠的方式从本地运行的程序向 Citrix 会话上运行的程序发送一位消息 该客户端称为 MetaFrame 演示服务器客户端 到目前为止我想到了以下几种方法 使用 TCP IP 然而
  • sql server中日期时间的内部表示是什么?

    SQL Server 中存储的日期时间值的基础数据结构是什么 2000 和 2005 如果不同 即精确到字节表示 据推测 当您选择日期时间列时获得的默认表示形式是特定于区域性的值 可能会发生变化 也就是说 一些我们看不到的底层结构被格式化为
  • 如何使用 GetAsyncEnumerator 中止正在运行的 EF Core 查询?

    我正在使用 EF Core 5 0 并有以下代码 public async IAsyncEnumerable
  • 在哪里可以找到图片的 Instagram 媒体 ID

    我正在寻找MediaID已上传的 Instagram 图片 它应该看起来像 1234567894561231236 33215652 我发现最后一组整数是usersID 例如 这是直接图像的链接 但是我看不到mediaID以正确的格式 ht
  • ES6 中检查构造函数是否继承另一个构造函数

    我遇到一种情况 我需要检查构造函数 X 的原型链中是否有另一个构造函数 Y 或者是 Y 本身 最快的方法可能是 new X instanceof Y 在这种情况下 这不是一个选项 因为如果在没有有效参数的情况下实例化 相关构造函数可能会抛出
  • 如何使用谷歌性能工具

    我刚刚开始使用谷歌性能工具 google perftools and libgoogle perftools4ubuntu 中的软件包 我发誓我在谷歌上搜索了大约一天 但没有找到答案 问题是我没有通过 CPU 分析获得所有函数的结果 这是我