我正在用C++ (在Linux上)编程,最近我开始使用Valgrind/Callgrind来优化我的代码。在阅读了几个教程之后,似乎专注于具有最高“自我”成本的函数是一个好主意。
我发现了两个自身成本很高的函数(它们都被调用了>1M次,并且相对于整个程序执行时间,每个函数都有>10%的自我成本)。在kcachegrind中,它显示:

然而,Callgrind没有告诉我函数的哪一部分弥补了自身的成本,这使得优化代码变得困难。自我成本到底是什么,我如何尝试降低它?
我的理解/猜测是,自我成本包括读/写数据、缓存未命中、基本数学操作、复制堆栈中的内容(包括函数参数)等。在我可以解决它之前,我如何知道它是哪一个?
谢谢
发布于 2020-02-07 17:32:41
Callgrind/Kcachegrind可以通过两种方式表示时间。
--cache-sim=yes用于缓存模拟,--branch-sim=yes用于分支预测器模拟。请注意,Valgrind只有简单的缓存模拟和基本的分支预测器。"Self“是在每个函数中花费的时间(不包括任何子函数)。“包含性”是指在一个函数及其调用的所有子函数上所花费的时间。
如果您希望查看花费在函数中的时间的细目,则需要使用调试信息编译您的应用程序。然后,在Callgrind下运行应用程序并在Kcachegrind中打开输出文件后,您可以查看右上角窗格中的"Source Code“选项卡。这应该会在函数的每一行上给出时间的指示。
https://stackoverflow.com/questions/60084991
复制相似问题