C 我如何证明或反驳编译的效率?

C 我如何证明或反驳编译的效率?,c,assembly,C,Assembly,这是一个不寻常的问题,但我确实希望有一个明确的答案 关于编译器如何高效地生成代码,特别是指令的数量,在我们的办公室里有一个长期的争论。我们为几乎没有环路的低功耗嵌入式系统编写代码。因此,发出的指令数与功耗成正比 我们的大部分代码都是这样的(注意,没有动态内存分配,没有系统调用,很少函数调用,很少循环) 我可以用-O3编译上面的代码片段并读取程序集,但我自己无法编写 我想证明或反驳的说法是,与手工编写的汇编代码相比,编译器生成的代码要“胖”2-4倍(因此要消耗2-4倍的能量) 我对任何你有经验的编

这是一个不寻常的问题,但我确实希望有一个明确的答案

关于编译器如何高效地生成代码,特别是指令的数量,在我们的办公室里有一个长期的争论。我们为几乎没有环路的低功耗嵌入式系统编写代码。因此,发出的指令数与功耗成正比

我们的大部分代码都是这样的(注意,没有动态内存分配,没有系统调用,很少函数调用,很少循环)

我可以用
-O3
编译上面的代码片段并读取程序集,但我自己无法编写

我想证明或反驳的说法是,与手工编写的汇编代码相比,编译器生成的代码要“胖”2-4倍(因此要消耗2-4倍的能量)

我对任何你有经验的编译器都感兴趣

据我所知,GCC和clang可以发出与C代码交错的程序集

gcc -g -c -Wa,-alh foo.cc
这些答案提供了坚实的基础:


如何衡量编译器生成代码的效率?

编辑,好吧,这很有趣

那些声称编译器的性能优于人类的人,实际上是那些没有进行检查的人。编译器可以创建的任何东西都可以由人创建。但是编译器不能总是创建人类可以创建的代码。就这么简单。对于从几行到几十行或更大的项目,手工修复编译器所做的优化变得越来越容易。编译器和目标有助于缩小这一差距,但总会有受过教育的人能够达到或超过编译器的输出

我想证明或反驳的说法是编译器生成 代码是2-4倍“胖”(因此消耗2-4倍) 电源)与手写的汇编代码相比

除非你将“肥胖者”定义为使用那么多能量。二进制文件的大小和功耗无关。如果整个问题/项目与功耗有关,编译器将不考虑您选择的bios设置(假设您谈论的是PC机)、视频卡、硬盘、显示器、鼠标、键盘等。此外,处理器只是等式中的一部分(相对较小)。即使有人会制作一个只会提高代码效率的编译器,他们也不能也不会为地球上的每一个系统调整编译器。不会发生的

如果你使用的手机是一个非常受控制的环境,那么应用程序可能会被调整以节省电力,但编译器不是这方面的主人,而是用户,编译器完成了其中的一部分,其余部分由程序员手动调整

I can compile the above snippet with -O3 and read the assembly, but I couldn't write it myself.
如果你以这种态度进入这一领域,那么你就自动失败了。是的,你可以满足或击败编译器,句号。这是一个信心、意志力和时间/努力的问题。这句话意味着你没有真正研究过这个问题,这就是为什么你要问这个问题。花些时间,做更多的研究,在stackoverflow上提出详细的问题(不是像这样的开放式问题),随着时间的推移,你将了解编译器做什么和不做什么以及为什么,特别是为什么它们不完美(对于定义这种观点的任何一个或多个统治者而言)。这个问题完全是关于意见的,会引发火焰之战,这样的问题会被关闭并最终从这个网站上删除。相反,编写、编译和发布代码段,并提出关于“为什么编译器生成此输出,为什么不将其转换为[此]”的问题。这些问题有更好的机会得到真正的答案,并留在这里供其他人学习。

如果问题是“我如何衡量编译器生成代码的效率”(您的实际问题),答案是“这取决于”。这取决于您如何定义“效率”。大多数情况下,编译器是为优化速度而设计的。当您更改优化级别(
-O1,-O2,-O3
)时,编译器将花费更多时间查找”这可能涉及循环展开、执行顺序、寄存器的使用以及许多其他事情

似乎你的“效率”标准不是编译器设计的目标:你说你想要“最少的周期”,因为你认为==最低的功耗。然而,我认为“最快的执行”==处理器再次进入待机模式之前的最短时间”。除非你认为处理器的功耗是“唤醒”“随着指令的执行,模式发生了显著变化,我认为可以肯定地说,最快的执行==最短的唤醒时间==最低的功耗


在这种情况下,“胖代码”并不重要——它只是回到了速度。还请注意,并非所有指令都采用相同的时钟周期数(尽管公平地说,这取决于处理器)。

手动汇编至少可以匹配编译器,因为至少可以从编译器生成的汇编代码开始,并对其进行调整以使其更好。要真正做好这项工作,您需要了解CPU体系结构(管道、功能单元、内存层次结构、无序调度单元等),以便能够调度每条指令以获得最大效率

另一个要考虑的是指令的数量不一定直接与性能成正比,无论是速度还是功率(见亨尼西和帕特森)。基本上,除了指令数(和时钟频率)之外,还必须查看每条指令所需的时钟周期,才能知道它需要多长时间。要知道要消耗多少能量,还需要知道每条指令需要消耗多少能量

CPU执行每条指令的方式会影响ho
I can compile the above snippet with -O3 and read the assembly, but I couldn't write it myself.