C Profilers的建议?

Mic*_*ael 39 c profiler profiling

在执行优化之前,每个人总是说要对程序进行概要分析,但没有人描述过如何执行优化.

您对C代码进行分析的做法是什么?

Ale*_*lli 28

使用gcc,我编译和链接-pg(如解释,例如在这里),然后通过运行程序(根据还建议在该网址原则),并使用继续gprof.如果您使用不同的编译器和c,这些工具会有所不同,但即使这样,仍然建议使用URL,以获取有关如何以及为何分析代码的一般概念的部分.

  • 重要的是在探查器下运行您的应用程序,其方式既代表了应用程序的正常使用方式,也是可重复的.一组特定的测试用例会有所帮助. (2认同)

Chi*_*Uni 13

如果您使用的是Linux,那么我建议使用ValGrindCallGrind以及KCacheGrind的组合.ValGrind是一种用于查找内存泄漏的极好方法,而CallGrind扩展是一个很好的分析器.

注意:我刚刚了解到 ValGrind现在也适用于Mac OSX.但是,自2005年以来,CallGrind和KCacheGrind尚未更新.您可能希望查看其他前端.


Mik*_*vey 6

很高兴你问了 :-) 如果你不介意逆势,请查看以下答案:

让我试着简而言之:

  1. 是程序在等你,还是你在等它?如果它没有让你等待它,那么你就没有问题,所以不要管它。

  2. 如果它确实让你等待,那么继续。

我建议采样,即在程序繁忙时(不等你)获取程序正在做什么的频闪 X 射线。至少获取调用堆栈的样本,而不仅仅是程序计数器。如果您只获得程序计数器的样本,那么如果您的程序在 I/O 或库例程中花费大量时间将毫无意义,所以不要满足于此。

如果您想获得大量样本,则需要一个分析器。如果您只需要几个,调试器中的暂停按钮就可以正常工作。以我的经验,20 个绰绰有余,5 个通常就足够了。

为什么?假设您有 1000 个调用堆栈样本。每个样本代表一小段挂钟时间,仅因为堆栈上的每一行代码都请求它而被花费。因此,如果有一行代码出现在 1000 个样本中的 557 个样本上,您可以假设它负责 557/1000 的时间,给出或获取一些样本 (15)。这意味着,如果整个执行时间花费了您 100 美元,那么该行本身的成本为 55.70 美元,给予或接受 1.50 美元**,因此您应该查看是否真的需要它。

但是你需要1000个样本吗?如果该生产线花费大约 55.7% 的时间,那么如果您只采集 10 个样本,您会在其中 6 个样本上看到它,给出或获取 1.5 个样本。因此,如果您确实在 10 个样品中的 6 个上看到了声明,您就会知道这 100 美元中的成本大约在 45 美元到 75 美元之间。即使它的成本仅为 45 美元,您难道不想看看您是否真的需要它吗?

这就是您不需要大量样本的原因——您不需要很高的准确性。您需要的是堆栈示例给您的内容——它们准确地将您指向最有价值的线路进行优化。

** 样本数量的标准偏差是sqrt( f * (1-f) * nsamp )其中f是包含该线的样本的分数。