我尝试使用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!
答案 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收到信号SIGPROF
:http://en.wikipedia.org/wiki/SIGPROF(可能意味着你的程序花了太长时间)。