无法使用 gprof 累积时间 - gnu 分析器

Posted

技术标签:

【中文标题】无法使用 gprof 累积时间 - gnu 分析器【英文标题】:unable to accumulate time using gprof - the gnu profiler 【发布时间】:2009-08-17 12:36:34 【问题描述】:

我在 Windows 上运行 cygwin 并使用最新版本的 gprof 来分析我的代码。我的问题是平面配置文件对我的代码中的每个函数显示零秒,我什至尝试循环函数(尝试了一百万个 for 循环)但 gprof 无法累积任何时间。请帮助。这是我的示例函数之一。

bool is_adjacent(const char* a ,const char* b)

  for(long long iter=0;iter<=1000000;iter++)
  string line1="qwertyuiop";
  string line2="asdfghjkl";
  string line3="zxcvbnm";
  string line4="1234567890";
  int pos=line1.find(*a);
  if(pos!=string::npos)
    if ((line1[pos++]==*b)||((pos!=0)&&(line1[pos--]==*b)))
      return true;
    else return false;
  pos=line2.find(*a);  
  if(pos!=string::npos)
    if ((line2[pos++]==*b)||((pos!=0)&&(line2[pos--]==*b)))
      return true;
    else return false;
  pos=line3.find(*a);  
  if(pos!=string::npos)
    if ((line3[pos++]==*b)||((pos!=0)&&(line3[pos--]==*b)))
      return true;
    else return false;
  pos=line4.find(*a);  
  if(pos!=string::npos)
    if ((line4[pos++]==*b)||((pos!=0)&&(line4[pos--]==*b)))
      return true;
    else return false;
  
 

【问题讨论】:

我们需要更多信息来帮助解决这个问题。你能给我们(1)你传递给运行gprof的命令行,和(更重要的是)(2)你用来编译你的程序的命令行吗? 1.编译:$g++ -pg comp.cpp 2.执行:$./a.exe 3.Gprof $gprof a.exe 【参考方案1】:

我不时遇到这个问题。特别是。在重线程代码中。

您可以将 valgrind 与 --callgrind 选项(工具)一起使用,这将使您至少可以更详细地了解每个函数调用的时间。还有一个 kde 工具可以更好地可视化输出(和 eswp.callgraph),称为 kcachegrind。不知道你是否可以在cygwin上安装它。

【讨论】:

【参考方案2】:

如果您的总体目标是发现并消除性能问题,您可以consider this.

我怀疑它会表明基本上 100% 的 CPU 时间都花在了查找和字符串比较上,剩下的几乎 0% 用于您的代码。仅对程序计数器进行采样时会发生这种情况。

如果您对调用堆栈进行采样,您将看到调用 find 和 string-compare 的代码行将显示在堆栈上,其频率等于它们负责的时间。

这就是gprof的荣耀。

附:您也可以通过在反汇编级别单步执行代码来解决此问题。

【讨论】:

【参考方案3】:

您使用的是什么版本的 gprof?一些旧版本有这个确切的错误。

运行 gprof --version 并告诉我们结果。

【讨论】:

以上是关于无法使用 gprof 累积时间 - gnu 分析器的主要内容,如果未能解决你的问题,请参考以下文章

GNU profiler(gprof)使用

性能测试工具GNU gprof

GNU 对 C 程序的行级分析

程序性能调优工具之gprob

gprof 中计算的时间是不是包括未分析的函数所花费的时间?

Linux性能评测工具之一:gprof篇