无法使用gprof积累时间 - gnu探查器

时间:2009-08-17 12:36:35

标签: c++ cygwin profiler gprof

我在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;}
  }
} 

3 个答案:

答案 0 :(得分:1)

如果您的总体目标是查找和消除性能问题,则可以consider this.

我怀疑它会显示基本上100%的CPU时间用于查找和字符串比较,几乎为您的代码留下0%。这就是仅对程序计数器进行采样时会发生的情况。

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

这是gprof的荣耀。

P.S。您也可以通过在反汇编级别单步执行代码来解决这个问题。

答案 1 :(得分:1)

我经常遇到这个问题。 ESP。在严格的线程代码中。

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

答案 2 :(得分:0)

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

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