在分析代码时,我应该使用匹配(gcc)编译器优化标志吗
Should I use matching (gcc) compiler optimization flags when profiling the code?
我在编译代码时使用-O3,现在我需要对其进行评测。对于评测,我遇到了两个主要选择:valgrind--tool=callgrind和gprof。
Valgrind(callgrind)文档状态:
与Cachegrind一样,您可能希望在编译时使用调试信息(-g选项)并打开优化。
然而,在Agner Fog的C++优化书中,我读到了以下内容:
许多优化选项与调试不兼容。调试器可以执行每次编写一行代码并显示所有变量的值。显然,这是不可能的当部分代码被重新排序、内联或优化掉时。常见于使程序的两个版本可执行:具有完全调试支持的调试版本在程序开发过程中使用的,以及具有所有相关功能的发布版本优化选项已打开。大多数IDE(集成开发环境)都有用于制作对象文件和可执行文件的调试版本和发布版本的工具。请确保区分这两个版本,并在中关闭调试和分析支持可执行文件的优化版本。
这似乎与编译代码的callgrind
指令与调试信息标志-g
相冲突。如果我以以下方式启用调试:
-ggdb -DFULLDEBUG
我是否导致此选项与-O3
优化标志冲突?在我读了这么多之后,把这两个选项放在一起对我来说毫无意义。
如果我使用比如-O3
优化标志,我可以使用编译带有额外分析信息的代码吗
-pg
仍然用valgrind来描述它?
评测用编译的代码有意义吗
-ggdb -DFULLDEBUG -O0
旗帜?这似乎很愚蠢——不内联函数和展开循环可能会改变代码中的瓶颈,所以这应该只用于开发,以使代码真正正确地执行。
用一个优化标志编译代码,并用另一个优化标记编译代码,这有意义吗?
为什么要进行分析?只是为了测量还是为了寻找加速?
人们普遍认为,应该只评测优化的代码,这是基于假设代码一开始几乎是最优的,如果有显著的加速,那就不是了。
你应该像对待bug一样对待加速的发现。许多人使用这种方法这样做。
在您删除了不必要的计算之后,如果您仍然有紧张的CPU循环,即您没有将所有时间都花在优化器看不到的系统、库或i/O例程中,那么打开-O3,让它发挥它的魔力。
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 初始化迭代器错误 C++ 在 GCC 编译器中
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- 为什么 gcc 编译器标志未知?
- 如何使用 GCC 编译器优化创建静态库?
- GCC 编译器是否应该对涉及 [[fallthrough]] 属性的格式错误的C++代码进行诊断?
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- gcc c++编译器中的零大小数组
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- template-id 与任何模板声明 GNU gcc 编译器都不匹配
- 关于 PBC 库在 GCC 编译器在 DEV C++ 中使用
- 选择默认的 gcc/g++ 编译器
- GCC编译器,为较低版本的GCC编译应用程序
- 相同的代码在不同的 gcc 编译器中存在巨大的性能差异
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- GCC 编译器错误:stl_construct.h、stl_uninitialized.h
- 如何从我的qt应用程序运行gcc编译器?
- GCC 编译器错误:stl_construct.h
- 升级 gcc 编译器/其他修复程序以向后兼容
- GCC 编译器一个字节中有多少位