在分析代码时,我应该使用匹配(gcc)编译器优化标志吗?

时间:2014-02-14 10:09:56

标签: c++ gcc gdb profiling valgrind

我在编译代码时使用-O3,现在我需要对其进行分析。对于分析,我遇到了两个主要选择:valgrind --tool=callgrindgprof

Valgrind(callgrind)docs说:

  

与Cachegrind一样,您可能希望使用调试信息(-g选项)进行编译并启用优化。

然而,在Agner Fog的C++ optimization book中,我已阅读以下内容:

  

许多优化选项与调试不兼容。调试器可以执行a   一次编码一行并显示所有变量的值。显然,这是不可能的   当部分代码被重新排序,内联或优化时。这很常见   制作程序可执行的两个版本:具有完全调试支持的调试版本   在程序开发期间使用,以及与所有相关的发布版本   优化选项已打开。大多数IDE(集成开发环境)都有   用于制作调试版本以及对象文件和可执行文件的发行版本的工具。   确保区分这两个版本并关闭调试和分析支持   可执行文件的优化版本。

这似乎与callgrind指令冲突,以使用调试信息标志-g编译代码。如果我按以下方式启用调试:

-ggdb -DFULLDEBUG

我是不是导致此选项与-O3优化标志冲突?在我到目前为止所阅读的内容之后,使用这两个选项对我来说毫无意义。

如果我使用说-O3优化标志,我可以使用以下方法编译带有其他分析信息的代码:

-pg

仍然用valgrind描述它?

分析用

编译的代码是否有意义
-ggdb -DFULLDEBUG -O0

标志?这看起来很愚蠢 - 不是内联函数和展开循环可能会改变代码中的瓶颈,所以这应该仅用于开发,以使代码实际正确地执行操作

用一个优化标志编译代码并用另一个优化标志编译代码是否有意义?

1 个答案:

答案 0 :(得分:2)

为什么要剖析?只是为了测量或找到加速?

您应该只分析优化代码的常识是基于假设代码几乎是最佳的开始,如果有显着的加速,则不是。

你应该将加速的发现看作是错误。许多人使用this method这样做。

在你删除了不必要的计算后,如果你仍然有紧张的CPU循环,即你没有把全部时间花在系统或库或优化器没有看到的I / O例程上,那么打开-O3,让它发挥它的魔力。