【发布时间】:2013-09-14 20:55:10
【问题描述】:
这是一个不寻常的问题,但我确实希望有一个明确的答案。
关于编译器生成代码的效率,特别是指令的数量,我们办公室一直存在争论。我们为几乎没有循环的低功耗嵌入式系统编写代码。因此,发出的指令数量与功耗成正比。
我们的大部分代码看起来像这样(注意,没有动态内存分配,没有系统调用,很少的函数调用,很少的循环)。
foo += 3 * (77 + bar);
if (baz > 18 - qux)
bar -= 19 + 7 >> spam;
我可以用-O3编译上面的sn-p并读取程序集,但是我自己写不出来。
我想证明或反驳的说法是,与手写汇编代码相比,编译器生成的代码“胖”2-4 倍(因此消耗的功率是手写汇编代码的 2-4 倍)。
我对您有经验的任何编译器都感兴趣。
来自this answer 我知道 GCC 和 clang 可以发出与 C 代码交错的程序集
gcc -g -c -Wa,-alh foo.cc
这些答案提供了坚实的基础:
Why do you program in assembly?
如何衡量编译器生成代码的效率?
【问题讨论】:
-
我认为您必须证明“指令数”==“功耗”。当你的处理器“什么都不做”时它会做什么?
-
简单答案:基准测试。你可以整天争论速度或大小的优点。但在一天结束时,看到实际结果会让人感到满足。构建针对速度或大小优化的 exe,然后在机器上进行测试。使用正在讨论的方法再次构建它,然后根据第一种方法对其进行测试,依此类推。与简单的辩论相比,您将获得更明确的结果。
-
另外,如果您真的关心代码大小,最好将 gcc 与
-Os而非-O3进行比较:gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html -
@ryker 我认为这并不能真正说明 OP 的问题,因为他说他不能手动编写汇编代码 - 这是他需要进行基准测试的方法。跨度>
-
@JohnFaulkner 没错。一个人可以写出糟糕的汇编程序并说“看看编译器有多好”,但这是最糟糕的稻草人论点:)