【问题标题】:What exactly is self time in C++ Callgrind?C ++ Callgrind中的自我时间到底是什么?
【发布时间】:2020-05-21 21:51:02
【问题描述】:

我正在使用 C++(在 Linux 上)进行编程,最近我开始使用 Valgrind/Callgrind 来优化我的代码。在阅读了几个教程之后,似乎关注具有最高“自我”成本的函数是一个好主意。

我发现两个函数的自身成本很高(相对于整个程序执行时间,它们都被调用 >1M 次,并且每个函数的自身成本都 >10%)。在 kcachegrind 中显示:

但是,Callgrind 并没有告诉我函数的哪一部分弥补了自我成本,因此难以优化代码。什么是自我成本,我该如何尝试降低它?

我的理解/猜测是,自我成本包括读取/写入数据、缓存未命中、基本数学运算、在堆栈中复制内容(包括函数参数)等。在解决它之前,我如何知道它是哪一个?

谢谢

【问题讨论】:

  • 你能在问题中包含输出吗?
  • 嗨@idclev463035818,你到底需要看什么? (一般信息/被调用者地图/源代码?)
  • 我主要是好奇;)。老实说,我还不知道我是否可以回答,但是当我试图搜索它时,第一个障碍是我没有找到任何关于“自我时间”的东西,而只有“自我成本”。显示您尝试解释的输出将有助于其他人解释它
  • 你说得对,我不认为自我时间是正确的术语。 :) 我用“自我”成本取代了“自我时间”。我已经包含了一个来自 kcachegrind 的小屏幕截图。
  • 因此,在该特定功能的 18% 总成本中,14% 是自费,其中 3-4% 可归因于代码中的特定行(使用kcachegrind)。我怎样才能知道剩下的约 10% 的自费来自哪里?

标签: c++ valgrind self callgrind


【解决方案1】:

Callgrind/Kcachegrind 可以通过两种方式表示时间。

  1. % 相对。这是默认设置,所有时间都表示为总时间的百分比。
  2. 绝对。这是“周期估计”的计数。这是基于各种“事件”,如指令读取、数据缓存未命中等。默认情况下,callgrind 只会计算指令读取 - 您需要添加选项 --cache-sim=yes 用于缓存模拟,--branch-sim=yes 用于分支预测器模拟。请注意,Valgrind 只有简单的缓存模拟和基本的分支预测器。

“Self”是每个函数花费的时间(不包括任何子函数)。 “包容性”是在函数及其调用的所有子函数中花费的时间,可传递。

如果您想查看函数所用时间的细分,您需要使用调试信息编译您的应用程序。然后在 Callgrind 下运行您的应用程序并在 Kcachegrind 中打开输出文件后,您可以查看右上角窗格中的“源代码”选项卡。这应该指示函数每一行的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多