【问题标题】:Callgrind inlined functionsCallgrind 内联函数
【发布时间】:2012-10-23 12:20:34
【问题描述】:

我正在分析我的代码,我已经找到了其中最昂贵的部分。然而,它发生在一个内联函数中。为了衡量影响,我强制该函数不被内联。

现在我想报告准确的分析数据。如果没有内联,我们的开销会很大(该函数基本上是一个循环,但它被非常非常频繁地调用)。

我想知道是否可以指示 valgrind 将代码的特定部分视为其本身的函数(如 makros CALLGRIND_START_INSTRUMENTATION、CALLGRIND_STOP_INSTRUMENTATION)而不强制函数不被内联。

【问题讨论】:

    标签: c++ gcc profiling valgrind callgrind


    【解决方案1】:
    valgrind --tool=callgrind
    

    能够显示很多关于 cpu 位置的详细信息(以及其他成本,例如 作为缓存)被使用。 kcachegrind(可视化工具)可以轻松显示各种成本 (包括内联函数)。

    尝试运行,例如与:

    valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes 
    

    注意:要查看指令级别的成本,您必须使用 kcachegrind

    【讨论】:

      【解决方案2】:

      也许您可以在调用函数之前和函数开头调用 CALLGRIND_TOGGLE_COLLECT 宏,同样适用于函数退出和函数调用之后。 例如

      int main()
      {
          CALLGRIND_TOGGLE_COLLECT;
          myFunction();
          CALLGRIND_TOGGLE_COLLECT;
      }
      
      __attribute__((noinline))
      void myFunction()
      {
          CALLGRIND_TOGGLE_COLLECT;
          //Do stuff
          CALLGRIND_TOGGLE_COLLECT;
      }
      

      应该做的伎俩。

      【讨论】:

        【解决方案3】:

        我不确定这是否是你想要的,但我不确定不是:) :
        http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

        此外,由于每条指令执行一次指令缓存读取 执行,您可以找出每个执行了多少条指令 行,这对于传统的分析很有用。

        【讨论】:

        • 是的,我读了那行,但是我找不到超出函数范围粒度的方法。
        猜你喜欢
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        相关资源
        最近更新 更多