首先,原谅我,因为我的问题可能看起来很愚蠢,但我很好奇为什么我在这个非常简单的代码中获得了性能提升。内联汇编性能优于C
这里的汇编代码:
__asm {
mov eax, 0
mov ecx, 0
jmp startloop
notequal:
inc eax
mov ecx, eax
sub ecx, 2
startloop:
cmp eax, 2000000000
jne notequal
};
,这是C代码:
long x = 0;
long ii = 0;
for(; ii < 2000000000; ++ii)
{
x = ii - 2;
};
C代码大约需要1060毫秒(在发行版本)来完成我的酷睿i5 2500K机和组装上在780ms结束。速度增加了25%。我不明白为什么我会得到这个结果,因为25%是一个很大的差异。编译器不够智能,无法生成我编写的相同的汇编代码?
BTW我使用MSVC 2010
感谢
这里是一个的被MSVC
[email protected]:
; Line 36
lea esi, DWORD PTR [eax-2]
inc eax
cmp eax, 2000000000 ; 77359400H
jl SHORT [email protected]
什么呢lea指令产生的(ASM)的代码做在这种情况下?
更新2
非常感谢大家。我刚刚在Nehalem xeon CPU上测试了这个代码,结果在这里完全相同。看起来像一个未知的原因,在Sandy桥上,asm代码运行得更快。
......和你用什么编译选项?任何优化选项,还是编译器生成最可能的最笨的代码?另外,请编译器生成它自己的程序集输出并进行比较。 – 2012-04-09 23:06:58
最佳优化:'ii = 2000000000,x = 1999999997'。如果您需要优化帮助,那么带有“禁忌”优化的代码是不现实的。 – Dani 2012-04-09 23:10:01
我使用了标准优化选项,/ O2和/ Ot – Davita 2012-04-09 23:10:22