4

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

3 回答 3

1

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

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

于 2009-09-02T16:27:00.680 回答
1

如果您的总体目标是发现并消除性能问题,您可以考虑这一点。

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

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

这就是gprof的荣耀。

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

于 2009-08-25T15:44:02.910 回答
0

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

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

于 2009-08-24T09:18:37.163 回答