valgrind,分析计时器已过期?

我尝试使用valgrind来分析一个简单的c prog:

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

我试图分析的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;
        }
    }
}

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


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


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

如果你真的想知道时间在哪里,你可以试试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: }

这里是堆叠式照片,在顶部最频繁地重新排序:

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。 当然,还有其他一些方法可以加速此代码,例如通过消除内部循环,如果您真的想要计算阶乘。

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


你不能计算10000! 像那样。 您将需要某种用于计算阶乘的bignum实现。 这是因为int通常是4个字节长,这意味着“通常”它可以容纳2^32 - 1 (signed int, 2^31 ) - 13! 不仅如此。 即使你使用了一个unsigned long (通常是8个字节),当你达到21!时,你就会溢出21!

至于“profiling timer expired”意味着什么 - 这意味着valgrind收到信号SIGPROF :http://en.wikipedia.org/wiki/SIGPROF(可能意味着你的程序花了太长时间)。

链接地址: http://www.djcxy.com/p/64939.html

上一篇: valgrind, profiling timer expired?

下一篇: Get info.plist source tree path by reverse engineering