代码之家  ›  专栏  ›  技术社区  ›  Michael

C型轮廓仪的建议?

  •  33
  • Michael  · 技术社区  · 15 年前

    每个人都会说在执行优化之前先分析您的程序,但从来没有人描述过如何进行优化。

    分析C代码的做法是什么?

    6 回复  |  直到 9 年前
        1
  •  24
  •   FabienAndre    9 年前

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

        2
  •  12
  •   Chip Uni    15 年前

    如果您使用的是Linux,那么我建议将 ValGrind CallGrind and KCacheGrind . valgrind是查找内存泄漏的极好方法,callgrind扩展可以生成一个好的分析器。

    注释 我只是 learned Valgrind现在也可以在Mac OSX上工作。然而,自2005年以来,callgrind和kcachegrind一直没有更新。你可能想看看 other front-ends .

        3
  •  3
  •   Community CDub    7 年前

    很高兴你问我:-) 如果您不介意逆向思维,请检查以下答案:

    让我简而言之:

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

        4
  •  1
  •   Georg Schölly Crazy Developer    15 年前

    Shark/Instruments(使用dtrace)是Mac上可用的配置文件。它们很不错。

        5
  •  1
  •   tr9sh    15 年前

    为了完成我会补充 oprofile .如果您想对内核进行基准测试,这就特别有趣了。

        6
  •  0
  •   Alex Budovski    15 年前

    Visual Studio Team System 有一个好的轮廓仪。 也, Intel VTune 还不错。