我在编译代码时使用了 -O3,现在我需要对其进行分析。在分析方面,我发现有两个主要选择:valgrind --tool=callgrind和gprof。
Valgrind(callgrind)文档中提到:
与Cachegrind一样,您可能希望使用调试信息(-g选项)和启用优化来编译。
然而,在Agner Fog的C++优化书籍中,我读到了以下内容:
许多优化选项与调试不兼容。调试器可以逐行执行代码并显示所有变量的值。显然,当代码的某些部分已被重新排序、内联或优化掉时,这是不可能的。通常会制作两个可执行程序版本:一个具有完整调试支持的调试版本,用于程序开发,另一个是打开所有相关优化选项的发布版本。大多数IDE(集成开发环境)都有制作对象文件和可执行文件的调试版本和发布版本的工具。请确保区分这两个版本,并在优化版本的可执行文件中关闭调试和分析支持。
这似乎与callgrind
指令编译代码时带上调试信息标志-g
相冲突。如果我按以下方式启用调试:
-ggdb -DFULLDEBUG
我使用这个选项不是会与-O3
优化标志冲突吗? 在我所阅读的内容中,同时使用这两个选项对我来说没有意义。
如果我使用 -O3
优化标志,我能否通过以下方式编译带有额外性能分析信息的代码:
-pg
您是否需要使用valgrind分析代码性能?
对于已经编译的代码进行分析,是否有意义?
-ggdb -DFULLDEBUG -O0
flags?这似乎很愚蠢-不内联函数和展开循环可能会转移代码中的瓶颈,因此这仅适用于开发,以使代码实际上正确地完成任务。
是否有意义使用一个优化标志编译代码,并使用另一个优化标志编译后对代码进行分析?
-g
与-O
标志不会发生太多冲突。这里有一个很好的讨论:https://dev59.com/F3VD5IYBdhLWcg3wGXlI - juanchopanza