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(可能意味着你的程序花了太长时间)。