C:分析C程序的瓶颈

C:分析C程序的瓶颈,c,debugging,C,Debugging,我的C程序对效率至关重要。有些函数被调用了数百万次,所以我想知道每个函数花费了多少时间,给我这样的东西: Total time: 100s forward(): 20s; align(): 15s; ... others: 1s. 是否有任何调试器可以执行此类分析?我在Ubuntu上使用EclipseCDT,并使用gdb进行调试。有人建议,但我没有找到合适的。我发现有一些关于c#或php或perl评测的问题,对c有什么建议吗?谢谢 ===============================

我的C程序对效率至关重要。有些函数被调用了数百万次,所以我想知道每个函数花费了多少时间,给我这样的东西:

Total time: 100s
forward(): 20s;
align(): 15s;
...
others: 1s.
是否有任何调试器可以执行此类分析?我在Ubuntu上使用EclipseCDT,并使用gdb进行调试。有人建议,但我没有找到合适的。我发现有一些关于c#或php或perl评测的问题,对c有什么建议吗?谢谢

===========================================

跟进:非常感谢您的帮助,gprof看起来真的很不错。这里有一个手动链接:

关于解释摘要的问题:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  us/call  us/call  name    
 61.29      9.18     9.18                             bwa_print_sam_SQ
 21.96     12.47     3.29                             bwt_sa
  4.01     13.07     0.60                             bns_coor_pac2real
  3.87     13.65     0.58                             bwt_match_exact_alt
  2.60     14.04     0.39                             bwa_read_seq
  1.00     14.19     0.15                             bwt_match_gap
  0.80     14.45     0.12                             seq_reverse
如果我没有错的话,它说bwa_print_sam_SQ函数占总时间的61.29%。但是我的程序运行96.24秒,这个函数应该运行60秒左右。为什么“累计”列的秒数只有9.18?手册上说:

cumulative seconds
    This is the cumulative total number of seconds the computer spent executing this functions, plus the time spent in all the functions above this one in this table. 
我使用参数

"gprof -f pe_sai2sam_se_core -f bwa_print_sam_SQ -f seq_reverse ./peta > gprof", 
其中函数“pe_sai2sam_se_core”在一个大的while循环中调用“bwa_print_sam_SQ”。为什么报告说:

index % time    self  children    called     name
                                                 <spontaneous>
[1]     61.3    9.18    0.00                 bwa_print_sam_SQ [1]
-----------------------------------------------
                                                 <spontaneous>
[8]      0.8    0.12    0.00                 seq_reverse [8]
-----------------------------------------------
索引%time自身子项调用名称
[1] 61.3 9.18 0.00 bwa_print_sam_SQ[1]
-----------------------------------------------
[8] 0.8 0.12 0.00序列号反向[8]
-----------------------------------------------

它没有说任何关于赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚赛亚。。。为什么?

您不需要调试器。你需要的是一个分析器。既然你提到Ubuntu,你可能想从
gprof
开始

以下是如何使用gprof的方法:

  • 禁用程序的所有编译器优化(
    -O0
    )-当然是可选的
  • 添加
    -g
    -pg
    标志
  • 像往常一样重建并运行程序
  • 此时,您的程序应该已经在cwd中生成了一个
    gmon.out
    文件
  • 使用
    gprof
    检查数据:

    gprof ./your_program > prof
    

现在您可以查看
prof
文件。它从平面轮廓开始,简单地告诉您它在各种功能上花费了多少时间。

valgrind with相当不错。Visual Studio的企业版包括一个轮廓器。Glowcode和其他一些工具都存在,只需在这里本地搜索探查器并享受一下。@蔡少江:gprof可能经常出错,在这里搜索其他探查器工具。只是好奇,为什么
-O0
?分析未优化的代码似乎有些奇怪。@HenkHolterman,以防止编译器乱来。不久前,我还在想为什么一个什么都不做的函数会占用70%的时间。它所做的只是调用一些甚至没有出现在配置文件中的函数。这本应该是显而易见的,但这不是为我。编译器正在内联东西。因此,鉴于这个故事,我总是担心编译器会在我背后做一些令人讨厌的事情,这会让分析器感到困惑。不管怎样,我编辑了我的答案。但是现在你可能会看到编译器可以轻松解决的“瓶颈”。我总是使用gprof。Valgrind还有一个名为Callgrind的插件(或模块,我不知道他们如何称呼他们的插件-啊!另一个词!),人们经常推荐它。但是我发现它很难使用,也不太理解这种复杂的分析器输出的需要(也许它在多线程运行时或动态代码中有更好的用途)。gprof的一个缺点是它存在于二进制文件中,它的代码不同。Valgrind是一个运行(完整)代码的VM。