繁体   English   中英

C与汇编程序的效率

[英]Efficiency of C vs Assembler

以下汇编代码的速度有多快:

shl ax, 1

与以下C代码相对应:

num = num * 2;

我怎么能找到?

您的装配变量可能更快,可能更慢。 是什么让你认为它必然更快?

x86平台上,有很多方法可以将某些东西乘以2.我希望编译器能够add ax, ax ,这比你的shl更直观,因为它不涉及可能存储的常量('1 '在你的情况下)。

而且,很长一段时间,在x86平台上,用常数乘以东西的首选方法不是移位,而是一个lea操作(如果可能的话)。 在上面的示例中,这将是lea eax, [eax*2] (乘以3的乘法将通过lea eax, [eax*2+eax]

轮班操作在某种程度上“更快”的信念对于新手而言是一个很好的老故事,今天几乎没有相关性。 而且,和往常一样,大多数情况下,您的编译器(如果它是最新的)对基础硬件平台的了解要远远超过对转换操作的天真热爱。

无论如何,这是一个学术问题吗? 我假设你明白它属于“理发减肥”的一般范畴。

如果您正在使用GCC ,请询问使用选项-S查看生成的程序集。 您可能会发现它与汇编程序指令相同。

要回答原来的问题,上外的顺序处理器指令速度由吞吐量和延迟测量,你会使用这两种措施RDTSC汇编指令。 但是其他人为你做了很多处理器,所以你不需要打扰。 PDF

在大多数情况下,它不会有所作为。 乘法在几乎所有现代硬件上都很快。 特别是,它通常足够快,除非你有精心设计的手动优化代码,否则管道将隐藏整个延迟,你将看不到两种情况之间的速度差异。

当您单独执行它们时,您可以测量乘法和移位的性能差异,但在其余编译代码的上下文中通常没有任何差异。 (正如我所指出的,如果代码经过精心优化,这可能不成立)。

现在,也就是说,移位通常仍然比乘法更快,并且几乎任何合理的编译器都会将固定的2次幂乘法映射到移位中(假设语义在目标体系结构上实际上是等效的)。

编辑:如果您真的关心这是x+x您可能想要尝试的另一件事。 我知道至少有一种架构,它实际上可以比移动更快,具体取决于周围环境。

如果你有一个不错的编译器,它将生成相同或类似的代码。 最好的方法是反汇编并检查创建的代码。

正如你在这里看到的那样,答案取决于许多事情。 编译器对C代码的作用取决于很多东西。 如果我们正在讨论x86-32,那么通常应该适用以下内容。

在基本级别,你的C代码表示一个内存变量,它需要至少一条指令乘以2:“shl mem,1”,在这种简单的情况下,C代码会慢一些。

如果num是局部变量,编译器可能会决定将其放入寄存器中(如果它经常使用和/或函数足够小),那么您将获得“shl reg,1”指令 - 也许。

最快的指令与它们在处理器中的实现方式有关。 Shl可能不是最佳选择,因为它影响C和Z标志,这会降低它的速度。 几年前,推荐是“lea reg,[reg + reg]”(所有reg都是相同的)因为lea没有影响任何标志,并且存在变体,例如(在x86-32平台上使用eax寄存器作为例):

lea eax,[eax+eax]    ; *2
lea eax,[eax+eax*2]  ; *3
lea eax,[eax+eax*4]  ; *5
lea eax,[eax+eax*8]  ; *9

我不知道今天的规范是什么,但你的编译器可能会。

至于在rdtsc指令上测量信息搜索,rdtsc指令是计算实际时钟周期的最佳选择。

将它们放在一个带有计数器的循环中,计数器如此之高,以至于在最快的情况下运行至少一秒钟。 使用您最喜欢的计时机制来查看每个计时的时间。

装配案例应在与用于纯C测试的相同C程序中使用内联汇编完成。 否则,你不是在比较苹果和苹果。

顺便说一句,我认为你应该添加第三个测试:

num <<= 1;

那么问题是这是否与装配版本相同。

如果,对于您的目标平台,向左移动是将数字乘以2的最快方法,那么编译器编译代码时可能会这样做。 看看反汇编来检查

因此,对于那一行,它可能完全相同的速度。 但是,由于你不太可能有一个只包含那一行的函数,你可能会发现编译器会推迟移位直到使用该值,或者将其与周围的代码混合在一起,使其不那么明确。 一个好的优化编译器通常可以很好地击败穷人到平均手写程序集。

如果现在最新的编译器(vc9)确实做得很好,它会比vc6大得多,而且不会发生这种情况,这就是为什么我甚至更喜欢使用VC6来运行比在mingw中编译的代码更快的代码。 -O3和VC9与/ Ox

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM