2013-03-30 32 views
-1

我想在C++代碼中添加512位(big int),轉換成visual studio中的masm內聯彙編程序。 進是在鏈路below.I所示的C++很重要也需要代表C++到MASM內聯彙編在Visual Studio簡化這個masm使其更快?

我試圖做到這一點在MASM,但它是緩慢的花mearly 700毫秒我masm代碼

C++ code Here。 C++注意到300毫秒此外

MASM代碼


_asm { 
     mov edx, summand 
     mov eax, [edx] 
     mov ebx, this 
     add eax, [ebx] 
     mov [ebx], eax

mov ecx, 4 mov eax, [edx + ecx] adc eax, [ebx + ecx] mov [ebx + ecx], eax mov ecx, 8 mov eax, [edx + ecx] adc eax, [ebx + ecx] mov [ebx + ecx], eax mov ecx, 12 mov eax, [edx + ecx] adc eax, [ebx + ecx] mov [ebx + ecx], eax }
+3

看起來你的C++編譯器在編寫代碼方面比你更好。這是可以預料的。現代編譯器進行英雄式的優化。你爲什麼期望能夠做得更好?你的編譯器發出了什麼代碼?它有什麼不同?你在你的時間有多自信? –

+0

C++代碼顯示在鏈接中..需要做的操作是100%肯定的每一個添加,無論是由C++或asm – user2226676

+1

C++代碼不執行。編譯器生成執行的代碼。那生成的代碼是什麼樣的?你過得怎麼樣?所以這裏有很多關於SO的基準問題都是由於有缺陷的時機。 –

回答

1

它可能更快地使用

mov eax, [edx + 4] 
adc eax, [ebx + 4] 
mov [ebx + 4], eax 

代替

mov ecx, 4 
mov eax, [edx + ecx] 
adc eax, [ebx + ecx] 
mov [ebx + ecx], eax 

與同爲8和12,但是我會如果你的代碼實際上比鏈接中的C++代碼慢,會感到驚訝。這可能是因爲使用asm塊會禁用函數的另一部分中的某些優化。你將不得不查看整個函數的生成彙編代碼來發現。 (什麼是你的700ms?)

+0

每增加一次,每增加一次就會花費將近700毫秒。這絕不會改變速度,僅僅幾毫秒。 – user2226676

+0

毫秒錶示毫秒我從哪裏來... – TonyK

+0

@TonyK編譯器可能會使用SSE單元SIMD添加。 –