很久很久以前,在一个遥远的星系中,我曾经用Delphi编写程序,然后,如果我需要快速完成某些事情,则可以用手写汇编器编写这些例程。它产生的代码比编译器快得多。
但是,在实践中,这不再是真的吗?显然,手写汇编器在原理上始终至少与已编译的高级代码一样快。但是,从那段黑暗时期开始,CPU取得了长足发展。现在,如果您要优化汇编程序,则必须考虑指令的顺序,以便它们可以流水线化或并行运行,分支预测的效果以及上百万种其他条件;而且我怀疑不可能将它们全部同时保存在人类RAM中。
那么,这是否意味着至少在为现代CPU进行编码时,如今,一个体面的(但不是超人的)程序员通过编写C会比编写手写汇编器产生更快的代码?
我发生的另一种可能性。优化是在将高级语言转换为汇编器之前还是之后进行的?如果是之后...生产手写汇编程序,然后通过编译器的优化过程,它会更快吗?
最近,当我为编程挑战编写一些代码时,出现了一个问题,其中的实质是生成一个应尽可能快地在Raspberry Pi上运行的例程。我将被允许用汇编器编写它;但是我的猜测是,即使Pi处理器在2014年的术语中没有那么复杂,精心编写的C也会更快。
使问题更具体和具体:
在我看来,到目前为止给出的两个答案都是正确的。答案尤其取决于我们正在讨论的特定CPU体系结构。体系结构越复杂,用手编写高效的ASM代码就越困难。
频谱的一端是CISC内核,例如x86。它们具有多个执行单元,较长的流水线,每条指令的可变指令等待时间等。在许多情况下,对于人类而言看起来“干净”或“最佳”的ASM代码实际上并不是CPU的最佳选择,可以通过使用指令进行改进或来自处理器手册黑暗角落的技术。编译器对此“了解”,并且可以生成相当不错的代码。没错,在很多情况下,熟练的人员可以改进发出的代码,但是使用正确的编译器和优化设置代码通常已经非常好。同样,有了C代码,您就不需要为每个新的CPU代手动对其进行优化(是的,优化通常取决于特定的CPU系列,而不仅取决于指令集),因此用C编写是一种“面向未来”
另一端是简单的RISC内核,例如8051(或其他简单的8位控制器)。它们具有更简单的调度语义和较小的指令集。编译器在这里仍然做了不错的优化工作,但是手工编写一个不错的ASM代码(或解决发出的代码中的性能问题)也要简单得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句