【问题标题】:Recommendations for C Profilers? [closed]对 C Profiler 的建议? [关闭]
【发布时间】:2010-12-20 04:06:09
【问题描述】:

每个人都说在执行优化之前要对您的程序进行概要分析,但从来没有人描述过如何做到这一点。

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

【问题讨论】:

  • 您使用的是什么编译器和操作系统?

标签: c profiling profiler


【解决方案1】:

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

【讨论】:

  • 重要的是在分析器下以既代表应用程序正常使用方式又可重复的方式运行应用程序。一套特定的测试用例会有所帮助。
  • 在使用 ELDK 的 PowerPC 嵌入式 linux 上,二进制文件无法运行得到 version GLIBC_2.16 not found
【解决方案2】:

如果您使用的是 Linux,那么我推荐ValGrindCallGrind and KCacheGrind 的组合。 ValGrind 是查找内存泄漏的绝佳方法,而 CallGrind 扩展是一个很好的分析器。

注意:我只是 learned ValGrind 现在也可以在 Mac OSX 上运行。但是,CallGrind 和 KCacheGrind 自 2005 年以来一直没有更新。您可能需要查看 other front-ends

【讨论】:

【解决方案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 是包含该行的样本的分数。

【讨论】:

  • 非常感谢您这篇非常有见地的帖子!有没有办法让 lldb 进行这种需要的随机暂停?
  • @Koz:我不知道 Ildb。我只是使用任何能够 Ctrl-Break 的调试器。
  • 第一个链接已失效。
  • @MikeDunlavey 您是 10K 用户。我不是。 OP 或任何其他可能正在浏览该网站的非用户也不是。
  • 问题已被删除。
【解决方案4】:

为了完整起见,我会添加oprofile。如果您想对内核进行基准测试,这尤其有趣。

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 我特别喜欢鲨鱼。非常有用(而且免费!)。
    【解决方案6】:

    Visual Studio Team System 带有一个很好的分析器。 还有Intel VTune也不错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2015-03-07
      • 2010-09-25
      相关资源
      最近更新 更多