Mic*_*ael 39 c profiler profiling
在执行优化之前,每个人总是说要对程序进行概要分析,但没有人描述过如何执行优化.
您对C代码进行分析的做法是什么?
Chi*_*Uni 13
如果您使用的是Linux,那么我建议使用ValGrind和CallGrind以及KCacheGrind的组合.ValGrind是一种用于查找内存泄漏的极好方法,而CallGrind扩展是一个很好的分析器.
注意:我刚刚了解到 ValGrind现在也适用于Mac OSX.但是,自2005年以来,CallGrind和KCacheGrind尚未更新.您可能希望查看其他前端.
很高兴你问了 :-) 如果你不介意逆势,请查看以下答案:
让我试着简而言之:
是程序在等你,还是你在等它?如果它没有让你等待它,那么你就没有问题,所以不要管它。
如果它确实让你等待,那么继续。
我建议采样,即在程序繁忙时(不等你)获取程序正在做什么的频闪 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是包含该线的样本的分数。