下面的汇编代码有多快:
shl ax, 1
与以下C代码相比:
num = num * 2;
我该如何找到答案呢?
shl ax, 1
与以下C代码相比:
num = num * 2;
我该如何找到答案呢?
你的汇编代码变体可能更快,也可能更慢。是什么让你认为它一定更快呢?
在 x86 平台上,有很多方法可以将某个数乘以2。我预计编译器会使用 add ax,ax
,这显然比你的 shl
操作更有效率,因为它不涉及潜在的常量存储(在你的情况下是“1”)。
此外,在 x86 平台上,很长一段时间里,将常量乘以其他数的首选方式并不是移位操作,而是一个 lea
操作(如果可能的话)。在上面的示例中,即 lea eax,[eax*2]
。(通过 lea eax,[eax*2+eax]
可以将一个数乘以3)
对于移位操作被认为更“快”的信仰已成为新手的一则美好的老故事,几乎无关紧要。并且,通常情况下,如果你的编译器是最新的,那么它对底层硬件平台的了解要比那些对移位操作有天真爱好的人更为深入。
请问这是一个学术问题吗?我猜你明白这属于“剪头发减肥”的一般类别。
add
还是 lea
的呢? - Pascal Cuoqlea eax,[eax+eax] ; *2
lea eax,[eax+eax*2] ; *3
lea eax,[eax+eax*4] ; *5
lea eax,[eax+eax*8] ; *9
我不知道现在的规范是什么,但你的编译器可能会知道。
至于测量,在这里搜索有关rdtsc指令的信息,它是最好的替代方案,因为它计算实际时钟周期。
如果你有一个不错的编译器,它会生成相同或类似的代码。最好的方法是反汇编并检查创建的代码。
将它们放入一个循环中,使用计数器使其运行时间至少为一秒钟。使用您喜欢的计时机制来查看每个操作所需的时间。
汇编测试应该在同一个C程序中使用内联汇编完成,以便与纯C测试进行比较。
顺便说一句,我认为您应该添加第三个测试:
num <<= 1;