2009-11-25 69 views
27

在执行优化之前,每个人都会说要对程序进行配置文件分析,但没有人描述过如何做。对于C Profilers的建议?

你有什么实践来分析C代码?

+2

你使用的是什么编译器和操作系统? – LnxPrgr3 2009-11-25 05:25:21

回答

21

使用gcc,我编译和-pg链路(如例如here解释),然后通过运行程序(根据还建议在该URL的原则),并使用gprof继续。如果您使用不同的编译器& c,这些工具将会有所不同,但即使如此,仍然建议使用URL来说明那些关于如何以及为什么要分析代码的一般想法的部分。

+1

重要的是在探查器下运行你的应用程序,这种方式既代表了应用程序通常使用的方式,也是可重复的。一组特定的测试用例可以帮助你。 – caf 2009-11-25 12:45:33

12

如果您使用的是Linux,那么我推荐组合ValGrindCallGrind and KCacheGrind。 ValGrind是用于查找内存泄漏的极好方法,CallGrind扩展使其成为一款优秀的分析器。

:我只是learned是Valgrind的,现在也适用于Mac OSX上。但是,CallGrind和KCacheGrind自2005年以来尚未更新。您可能需要查看other front-ends

1

鲨鱼/乐器(使用dtrace)是Mac上可用的分析器。他们很不错。

+1

我特别喜欢鲨鱼。非常有用(免费!)。 – justin 2009-12-10 22:35:01

3

高兴你问:-)如果你不介意的逆势而上,检查这些答案:

设我试着去简而言之:

  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是包含该行的样本的分数。

+0

非常感谢你这个非常有见地的帖子!有没有办法让lldb做这种随机暂停,这需要? – 2017-05-02 04:33:53

+0

@Koz:我不知道Ildb。我只使用任何能够进行Ctrl-Break的调试器。 – 2017-05-02 11:43:17

1

为了完成,我会添加oprofile。如果您想要对内核进行基准测试,那将是特别有趣的。