🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #250

optymalizacja

#250
From: tosamo
Date: Wed, 17 May 2006 12:42
118 lines
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-mail

Show 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