【发布时间】:2010-12-20 04:06:09
【问题描述】:
每个人都说在执行优化之前要对您的程序进行概要分析,但从来没有人描述过如何做到这一点。
您对 C 代码进行分析的做法是什么?
【问题讨论】:
-
您使用的是什么编译器和操作系统?
每个人都说在执行优化之前要对您的程序进行概要分析,但从来没有人描述过如何做到这一点。
您对 C 代码进行分析的做法是什么?
【问题讨论】:
使用gcc,我编译并链接-pg(如here 解释),然后继续运行程序(根据该URL 也建议的原则)并使用gprof。如果您使用不同的编译器和 c,工具会有所不同,但即使如此,仍然建议使用 URL,用于关于如何以及为什么分析您的代码的一般想法的部分。
【讨论】:
version GLIBC_2.16 not found
如果您使用的是 Linux,那么我推荐ValGrind 和CallGrind and KCacheGrind 的组合。 ValGrind 是查找内存泄漏的绝佳方法,而 CallGrind 扩展是一个很好的分析器。
注意:我只是 learned ValGrind 现在也可以在 Mac OSX 上运行。但是,CallGrind 和 KCacheGrind 自 2005 年以来一直没有更新。您可能需要查看 other front-ends。
【讨论】:
很高兴你问了 :-) 如果你不介意逆向思维,请查看以下答案:
让我试着简而言之:
程序是在等你,还是你在等它?如果它没有让你等待它,那么你没有问题,所以别管它。
如果确实让您等待,请继续。
我建议进行采样,即在程序繁忙(而不是等待您)时对程序正在执行的操作进行频闪 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 是包含该行的样本的分数。
【讨论】:
为了完整起见,我会添加oprofile。如果您想对内核进行基准测试,这尤其有趣。
【讨论】:
Shark / Instruments(使用 dtrace)是 Mac 上可用的分析器。他们很不错。
【讨论】:
Visual Studio Team System 带有一个很好的分析器。 还有Intel VTune也不错。
【讨论】: