我在编译代码时使用-O3,现在我需要对其进行分析。对于分析,我遇到了两个主要选择:valgrind --tool=callgrind和gprof。
Valgrind(callgrind)docs说:
与Cachegrind一样,您可能希望使用调试信息(-g选项)进行编译并启用优化。
然而,在Agner Fog的C++ optimization book中,我已阅读以下内容:
许多优化选项与调试不兼容。调试器可以执行a 一次编码一行并显示所有变量的值。显然,这是不可能的 当部分代码被重新排序,内联或优化时。这很常见 制作程序可执行的两个版本:具有完全调试支持的调试版本 在程序开发期间使用,以及与所有相关的发布版本 优化选项已打开。大多数IDE(集成开发环境)都有 用于制作调试版本以及对象文件和可执行文件的发行版本的工具。 确保区分这两个版本并关闭调试和分析支持 可执行文件的优化版本。
这似乎与callgrind
指令冲突,以使用调试信息标志-g
编译代码。如果我按以下方式启用调试:
-ggdb -DFULLDEBUG
我是不是导致此选项与-O3
优化标志冲突?在我到目前为止所阅读的内容之后,使用这两个选项对我来说毫无意义。
如果我使用说-O3
优化标志,我可以使用以下方法编译带有其他分析信息的代码:
-pg
仍然用valgrind描述它?
分析用
编译的代码是否有意义-ggdb -DFULLDEBUG -O0
标志?这看起来很愚蠢 - 不是内联函数和展开循环可能会改变代码中的瓶颈,所以这应该仅用于开发,以使代码实际正确地执行操作。
用一个优化标志编译代码并用另一个优化标志编译代码是否有意义?
答案 0 :(得分:2)
为什么要剖析?只是为了测量或找到加速?
您应该只分析优化代码的常识是基于假设代码几乎是最佳的开始,如果有显着的加速,则不是。
你应该将加速的发现看作是错误。许多人使用this method这样做。
在你删除了不必要的计算后,如果你仍然有紧张的CPU循环,即你没有把全部时间花在系统或库或优化器没有看到的I / O例程上,那么打开-O3,让它发挥它的魔力。