如何找到在Linux上运行的C++应用程序中运行缓慢的代码区域?


当前回答

较新的内核(例如最新的Ubuntu内核)附带了新的“perf”工具(apt-get-install-linux-tools)AKA perf_events。

这些都配有经典的采样分析器(手册页)以及很棒的时间图表!

重要的是,这些工具可以是系统评测,而不仅仅是进程评测-它们可以显示线程、进程和内核之间的交互,并让您了解进程之间的调度和I/O依赖关系。

其他回答

您可以使用loguru这样的日志框架,因为它包括时间戳和总运行时间,可以很好地用于分析:

我假设你在使用GCC。标准的解决方案是使用gprof进行分析。

在分析之前,请确保将-pg添加到编译中:

cc -o myprog myprog.c utils.c -g -pg

我还没有尝试过,但我听到了关于谷歌perftools的好消息。这绝对值得一试。

这里有相关问题。

如果gprof不适合您,还有一些流行语:Valgrind、Intel VTune、Sun DTrace。

如果没有一些选项,运行valgrind--tool=callgrind的答案并不完全。我们通常不希望在Valgrind下描述10分钟的缓慢启动时间,而希望在执行某些任务时描述我们的程序。

这就是我的建议。首先运行程序:

valgrind --tool=callgrind --dump-instr=yes -v --instr-atstart=no ./binary > tmp

现在,当它工作并且我们想要开始评测时,我们应该在另一个窗口中运行:

callgrind_control -i on

这将打开分析。若要关闭并停止整个任务,我们可以使用:

callgrind_control -k

现在,我们在当前目录中有一些名为callgrind.out.*的文件。要查看分析结果,请使用:

kcachegrind callgrind.out.*

我建议在下一个窗口中单击“Self”列标题,否则它会显示“main()”是最耗时的任务。“Self”显示每个函数本身花费的时间,而不是与依赖项一起花费的时间。

使用调试软件如何识别代码运行缓慢的地方?

如果你在运动中遇到障碍物,那么它会降低你的速度

如不需要的重新分配的循环、缓冲区溢出、搜索、内存泄漏等操作消耗更多的执行能力,这将对代码的性能产生不利影响,在分析之前,请确保将-pg添加到编译中:

g++your_prg.cpp-pg或cc my_program.cpp-g-pg(根据编译器)

我还没有尝试过,但我听到了关于谷歌perftools的好消息。这绝对值得一试。

valgrind--tool=callgrind/(二进制文件)

它将生成一个名为gmon.out或callgrind.out.x的文件。然后可以使用kcachegrind或调试器工具来读取该文件。它会给你一个图形化的分析结果,比如哪一行花费多少。

我认为是这样

您可以使用iprof库:

https://gitlab.com/Neurochrom/iprof

https://github.com/Neurochrom/iprof

它是跨平台的,允许您不实时测量应用程序的性能。您甚至可以将其与实时图表相结合。完整免责声明:我是作者。