Vic*_*Liu 11 c c++ compiler-construction assembly micro-optimization
我刚刚问了一个与编译器如何优化某些C++代码有关的问题,我正在寻找有关如何验证编译器是否已执行某些优化的任何问题.我试图查看用g ++(g++ -c -g -O2 -Wa,-ahl=file.s file.c)生成的汇编列表,可能会看到底层发生了什么,但输出对我来说太神秘了.人们使用什么技术来解决这个问题,是否有任何关于如何解释优化代码的汇编列表或特定于GCC工具链的文章的讨论这个问题的参考?
eph*_*ent 20
GCC的优化传递以一种称为GIMPLE的格式处理代码的中间表示.
使用-fdump-*选项系列,您可以要求GCC输出树的中间状态.
例如,将此提供给 gcc -c -fdump-tree-all -O3
unsigned fib(unsigned n) {
if (n < 2) return n;
return fib(n - 2) + fib(n - 1);
}
Run Code Online (Sandbox Code Playgroud)
并观察它逐渐从简单的指数算法转换为复杂的多项式算法.(真!)
一个有用的技术是在一个好的采样分析器下运行代码,例如 Linux 下的 Zoom 或 Mac OS X 下的 Instruments(使用 Time Profiler 仪器)。这些分析器不仅向您显示代码中的热点,还将源代码映射到反汇编对象代码。突出显示源代码行会显示映射到源代码行(反之亦然)的生成代码行(不一定是连续的)。在线操作码参考和优化技巧是一个不错的奖励。