Article View: pl.comp.lang.asm
Article #250optymalizacja
From: tosamo
Date: Wed, 17 May 2006 12:42
Date: Wed, 17 May 2006 12:42
118 lines
3618 bytes
3618 bytes
Witam
Pisze sobie porgramik w masm32 (wersja 6.11 chyba). Do tej pory pisalem
glownie w c i pascalu wiec na poczatku
program w asm wygladal jak dokladna kalka z jezykow wyzszego rzedu i dzialal
jakies 3 razy wolniej niz
pascal i delphi. Potem zaczalem optymalizowac i wyszlo na to, ze kazda
optymalizacja zwalnia dzialanie programu
o kilka(dziesiat) %.
Na przyklad:
Czemu takie cos :
mov edi,offset TABLICA
mov ecx,16
sha1_processmessageblock4:
mov eax,dword ptr [edi-12]
xor eax,dword ptr [edi-32]
xor eax,dword ptr [edi-56]
xor eax,dword ptr [edi-64]
rol eax,1
stosd
;
inc ecx
cmp ecx,80
jne sha1_processmessageblock4
Jest kilkukrotnie wolniejsze niz :
mov edi,offset TABLICA
mov ecx,16
sha1_processmessageblock4:
mov eax,ecx
shl eax,2
sub eax,12 ; 3 * 4
mov ebx,dword ptr [edi+eax]
sub eax,20 ; 5 * 4
xor ebx,dword ptr [edi+eax]
sub eax,24 ; 6 * 4
xor ebx,dword ptr [edi+eax]
sub eax,8 ; 2 * 4
xor ebx,dword ptr [edi+eax]
rol ebx,1
mov eax,ecx
shl eax,2
mov dword ptr [edi+eax],ebx
;
inc ecx
cmp ecx,80
jne sha1_processmessageblock4
Albo czemu takie cos :
mov esi,offset Buffers_ ; D
mov edi,offset Buffers__ ; E
std
movsd
movsd
ror DWORD PTR [esi],2
movsd
movsd
mov DWORD PTR [edi],eax
cld
Jest duzo wolniejsze niz :
mov ebx,DWORD PTR [Buffers+12] ; E = D
mov DWORD PTR [Buffers+16],ebx
;;
mov ebx,DWORD PTR [Buffers+8] ; D = C
mov DWORD PTR [Buffers+12],ebx
;
mov ebx,DWORD PTR [Buffers+4] ; C = SHA1CircularShift(30,B)
ror ebx,2
mov DWORD PTR [Buffers+8],ebx
;
mov ebx,DWORD PTR [Buffers] ; B = A
mov DWORD PTR [Buffers+4],ebx
;
mov ebx,eax
mov DWORD PTR [Buffers],eax ; A = temp
Albo na przyklad mam cos takiego :
mov al,byte ptr [esi+ecx]
mov byte ptr [edi+ebx],al
inc ecx
inc ebx
inc [Message_Block_Index] << TO JEST WAZNE
;
add [Length_Low],8
jnz sha1_input8 ;
inc [Length_High] ;
jnz sha1_input8
mov [Corrupted],1
Zmienna Message_Block_Index to zwykla zmienna DD w sekcji .data. Nie jest do
niczego juz potrzebna bo zamiast niej
zapisuje dane w rejestrach. Usuwam ta linie i program zwalnia o 5% !
Oczywiscie dziala bez zmiena tylko wolniej.
Oprocz tego na przyklad wielokrotne
mov eax,edx
shl eax,2
mov eax,DWORD PTR [Word_+eax] ;
Dziala oczywiscie duzo szybciej niz proste
mov esi,offset Word_
i potem juz tylko kilkadziesiat razy
lodsd
Czy ktos mi to wyjasni albo chociaz powie gdzie mozna jakies konkrety na ten
temat przeczytac ?
Technical Details
Message-ID:
<e4f5nl$rj4$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: "tosamo" <tosamo@o2.pl> Newsgroups: pl.comp.lang.asm Subject: optymalizacja Date: Wed, 17 May 2006 14:42:27 +0200 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 120 Message-ID: <e4f5nl$rj4$1@inews.gazeta.pl> NNTP-Posting-Host: aalp237.neoplus.adsl.tpnet.pl X-Trace: inews.gazeta.pl 1147869749 28260 83.5.45.237 (17 May 2006 12:42:29 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Wed, 17 May 2006 12:42:29 +0000 (UTC) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.1830 X-Priority: 3 X-RFC2646: Format=Flowed; Original X-Newsreader: Microsoft Outlook Express 6.00.3790.1830 X-User: etet100 X-MSMail-Priority: Normal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit