问题标签 [gperftools]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 分析(谷歌 cpu 性能工具)究竟测量了什么?
我尝试开始使用 Google Perf Tools 来分析一些 CPU 密集型应用程序。这是一种统计计算,使用“ofstream”将每个步骤转储到文件中。我不是 C++ 专家,所以我很难找到瓶颈。我的第一遍给出了结果:
这是令人惊讶的,因为所有真正的计算都发生在 SliceStep::DoStep 中。“_write$UNIX2003”(我在哪里可以找到这是什么?)似乎来自写入输出文件。现在,让我感到困惑的是,如果我注释掉所有outfile << "text"
语句并运行 pprof,95% 就在SliceStep::DoStep
其中,而 `_write$UNIX2003' 消失了。但是,按总时间衡量,我的应用程序并没有加快速度。整个过程的速度不到 1%。
我错过了什么?
补充:没有语句的 pprof 输出outfile <<
是:
这看起来像我所期望的,除了我没有看到性能的明显提升(10 秒计算中的 0.1 秒)。代码本质上是:
更新:我使用 boost::timer 计时,从分析器开始的地方开始,到结束的地方结束。我不使用线程或任何花哨的东西。
c++ - 我已经安装了 gperftools-2.0,但我无法获取 cpu 配置文件统计信息
我已经安装了 gperftools-2.0,但我无法获取 cpu 配置文件统计信息
以下是我获取统计信息的步骤:
- 安装 gperftools tar -xzvfj gperftools-2.0.tar.gz
2.编辑cpp文件test.cpp
编译 g++ test.cpp -o test -O0 -I/usr/local/include/ -L/usr/local/lib/ -lprofiler
运行 ./test
报告 pprof ./test --text test.prof
其输出为:使用本地文件 ./test。使用本地文件 test.prof。
我的步骤有什么问题?
profiling - 如何使用谷歌性能工具
我刚开始使用谷歌性能工具(google-perftools
和libgoogle-perftools4
ubuntu 中的包),我发誓我在谷歌上搜索了大约一天,但没有找到答案!问题是我没有通过 CPU 分析获得所有函数的结果。这是我的代码:
编译为g++ test.cc -lprofiler -o a.out
这就是我运行代码的方式:
我也试过这个:
这就是我从中得到的google-pprof --text a.out dump.txt
:
但是没有关于 foo 函数的信息!
我的系统信息:ubuntu 12.04 g++ 4.6.3
就这样!
profiling - 解释 GPerfTools 样本计数
我在阅读 GPerfTools 生成的文本输出时有些吃力。我认为部分问题在于我不完全了解采样方法的运作方式。
从Wikipedia我收集到基于示例函数的分析器通常通过向操作系统发送中断并查询程序的当前指令指针来工作。现在我对汇编的了解有点生疏,所以我想知道如果指令指针m
在任何给定时间指向方法意味着什么?即这是否意味着该函数即将被调用,或者它是否意味着它当前正在执行,或两者兼而有之?
如果我没记错的话会有区别,因为在第一种情况下,样本计数(即在采样时看到 m 的次数)转换为 m 的绝对调用计数,而在后一种情况下,它只是转换为看到的次数,即仅表示在此方法中花费的相对时间。
有人可以澄清吗?
gcc - gperftools CPU profiler 究竟是如何启动的?
gperftools 文档说libprofiler
应该链接到目标程序:
(不改变程序的代码)。
然后程序应该使用特定的环境变量运行:
问题是:如何libprofile
有机会启动和完成一个分析器,当它只是被加载,但它的函数没有被调用?
该库中没有构造函数(proof)。 库代码中“CPUPROFILE”的所有场合均不涉及启动分析器的任何地方。
我没有想法,下一步该去哪里看?
c++ - _L_unlock_16 处的性能瓶颈
我正在尝试使用 google perf tools CPU profiler 来调试多线程程序的性能问题。单线程需要 250 毫秒,而 4 线程需要大约 900 毫秒。
我的程序有一个跨线程共享的 mmap 文件,所有操作都是只读的。此外,我的程序创建了大量不跨线程共享的对象。(具体来说,我的程序使用 CRF++ 库进行一些查询)。我试图弄清楚如何让我的程序在多线程中表现得更好。gperf 工具的 CPU 分析器生成的调用图显示我的程序在_L_unlock_16中花费了大量时间(大约 50%)。
在网络上搜索 _L_unlock_16 指向一些错误报告,规范表明它与 libpthread 相关联。但除此之外,我找不到任何有用的调试信息。
简要说明我的程序的功能。我在文件中没有几个字(4)。在我的程序中,我有一个使用 CRF++ 处理单个单词的 processWord()。这个 processWord() 是每个线程执行的。我的 main() 从文件中读取单词,每个线程并行运行 processWord()。如果我处理一个单词(因此只有 1 个线程)需要 250 毫秒,所以如果我处理所有 4 个单词(因此是 4 个线程),我希望它在 250 毫秒的同时完成,但是正如我上面提到的,它需要大约 900 毫秒。这是执行的调用图 - https://www.dropbox.com/s/o1mkh477i7e9s4m/cgout_n2.png
我想了解为什么我的程序在 _L_unlock_16 上花费大量时间,以及我可以做些什么来缓解它。
linux - gperftools cpu profiler 不支持多进程?
根据文档http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html,cpu 配置文件确实支持多进程并将生成独立的输出文件:
如果你的程序分叉,子进程也将被分析(因为它们继承了相同的 CPUPROFILE 设置)。每个过程都单独分析;为了将子配置文件与父配置文件以及彼此区分开来,所有子配置文件都将其进程 ID 附加到 CPUPROFILE 名称。
但是当我尝试如下:
// main_cmd_argv.cpp
// 生成文件
// 外壳命令
看来gperf不支持多进程,有人可以解释一下吗?谢谢!
c++ - How to properly handle signals, so that gperftools CPU profiler still works?
I want to profile my daemon program, that pauses the main thread:
All other threads simply block all signals.
As far as I know the profiler uses SIGPROF
signal for its operations. If I start profiling with such a code, the output .prof file is empty:
env CPUPROFILE=daemon.prof ./daemon
How should I properly handle signals in main thread and other threads to enable profiling? Or may be an issue is somewhere else?
c++ - gperftools 不精确与 CPUPROFILE_FREQUENCY
我有一个gprof
似乎无法使用的任务。Callgrind 在这里帮了很多忙,但是当找到一个更gprof
类似于 gperftools 的解决方案时,就会投入其中进行尝试。
所以我写了一个虚拟程序并做了几个这样的试验:
CPUPROFILE_FREQUENCY在此处记录为默认为 100 并且是CPU-profiler 采样的每秒中断次数。在 7 秒的虚拟程序上将其设置为 50 时仅采样 14 次,而将其设置为 50000 时仅采样 80 次,我感到很陌生。
我想知道这个简单的环境更改是否可以在需要时获得更高的精度,以及 gperftools 中的 CPUPROFILE_FREQUENCY 是否损坏。
linux - GPERFTOOLS:CPUPROFILE_FREQUENCY 似乎非常有限
我一直在运行一个短期运行的程序(大约 1/8 秒的用户 CPU 时间),无论我多么努力,我永远无法获得超过 90 个样本。坦率地说,这还不够细粒度。
这意味着可以设置和处理不超过约 1K 警报/秒。
有没有办法缩小样本周期?众所周知,这会减慢程序速度(是否会添加更多上下文切换),但重要的是我能够获得如此快速的采样。
请注意,我在 3.2 LINUX 中运行,在 x86_64 上设置为 32 位模式。32 位模式很重要,因为最终目标将在 32 位设备上。