valgrind,分析计时器到期了吗?

时间:2010-01-27 10:33:09

标签: valgrind

我尝试使用valgrind配置一个简单的c prog:

  

[zsun @ nel6005001~] $ valgrind --tool = memcheck ./fl.out
  == 2238 == Memcheck,一个内存错误检测器
  == 2238 ==版权所有(C)2002-2009,以及Julian Seward等人的GNU GPL'd。   == 2238 ==使用Valgrind-3.5.0和LibVEX;用-h重新运行版权信息
  == 2238 ==命令:./ fl.out
  == 2238 ==
  == 2238 ==
  == 2238 == HEAP SUMMARY:
  == 2238 ==在退出时使用:1块中的1,168字节
  == 2238 ==总堆使用量:1个分配,0个释放,1,168个字节分配
  == == 2238
  == 2238 ==泄漏摘要:
  == 2238 ==绝对丢失:0块中的0字节
  == 2238 ==间接丢失:0块中的0字节
  == 2238 ==可能丢失:0块中的0字节
  == 2238 ==仍然可以访问:1个块中的1,168个字节
  == 2238 ==抑制:0块中的0字节
  == 2238 ==重新运行--leak-check = full以查看泄漏内存的详细信息   == 2238 ==
  == 2238 ==对于检测到的和抑制的错误计数,请重新运行:-v
  == 2238 ==错误摘要:来自0个上下文的0个错误(被抑制:12个来自8个)
  分析计时器已过期

我想要分析的c代码如下:

void forloop(void){
    int fac=1;
    int count=5;
    int i,k;

    for (i = 1; i <= count; i++){
        for(k=1;k<=count;k++){
            fac = fac * i;
        }
    }
}

“分析计时器已过期”显示,这是什么意思?如何解决这个问题呢? THX!

3 个答案:

答案 0 :(得分:18)

问题是您在使用-pg编译的程序上使用valgrind。你不能一起使用valgrind和gprof。 valgrind手册建议使用OProfile,如果你在Linux上,需要在valgrind下分析程序的实际模拟。

答案 1 :(得分:1)

顺便说一句,这不是计算因子。

如果你真的想找出时间的去处,你可以试试stackshots。我在你的代码周围放了一个无限循环,然后花了10个。这是代码:

 6: void forloop(void){ 
 7:   int fac=1; 
 8:   int count=5; 
 9:   int i,k; 
10:
11:   for (i = 1; i <= count; i++){ 
12:       for(k=1;k<=count;k++){ 
13:           fac = fac * i; 
14:       } 
15:   } 
16: } 
17:
18: int main(int argc, char* argv[])
19: {
20: int i;
21: for (;;){
22:     forloop();
23: }
24: return 0;
25: }

以下是stackshots,重新排序,最常见的是顶部:

forloop() line 12
main() line 23

forloop() line 12 + 21 bytes
main() line 23

forloop() line 12 + 21 bytes
main() line 23

forloop() line 12 + 9 bytes
main() line 23

forloop() line 13 + 7 bytes
main() line 23

forloop() line 13 + 3 bytes
main() line 23

forloop() line 6 + 22 bytes
main() line 23

forloop() line 14
main() line 23

forloop() line 7
main() line 23

forloop() line 11 + 9 bytes
main() line 23

这告诉你什么?它说第12行消耗大约40%的时间,而第13行消耗大约20%的时间。它还告诉你第23行消耗了近100%的时间。

这意味着在第12行展开循环可能会给你一个加速因子100 /(100-40)= 100/60 = 1.67x。当然还有其他方法来加速这段代码,例如通过消除内循环,如果你真的想要计算阶乘。

我只是指出这一点,因为这是一种简单的分析方法。

答案 2 :(得分:0)

您无法像这样计算10000!。您需要某种bignum实现计算因子。这是因为int“通常”长度为4个字节,这意味着“通常”它可以容纳2^32 - 1(signed int,2^31) - 13!不止于此。即使您使用unsigned long(“通常为”8个字节),当您到达21!时也会溢出。

至于“剖析计时器到期”是什么意思 - 这意味着valgrind收到信号SIGPROFhttp://en.wikipedia.org/wiki/SIGPROF(可能意味着你的程序花了太长时间)。