gpt4 book ai didi

c++ - C++ Callgrind 中的 self time 到底是什么?

转载 作者:行者123 更新时间:2023-12-02 05:32:12 27 4
gpt4 key购买 nike

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

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

enter image description here

然而,Callgrind 并没有告诉我函数的哪一部分弥补了自身成本,这使得优化代码变得困难。 self 成本到底是什么?我该如何降低它?

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

谢谢

最佳答案

Callgrind/Kcachegrind 有两种表示时间的方式。

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

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

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

关于c++ - C++ Callgrind 中的 self time 到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60084991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com