首先,原諒我,因爲我的問題可能看起來很愚蠢,但我很好奇爲什麼我在這個非常簡單的代碼中獲得了性能提升。內聯彙編性能優於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