środa, 23 maj 2012

NEXT 1/2007 - Układanie kodu

Układanie kodu - ikonka tworzenie zoptymalizowanych programów

Data: 19 wrzesień 2007
Identyfikator: 070103

Dzięki odpowiedniemu dopasowaniu sposobu programowania do architektury procesora można znacznie przyspieszyć działanie tworzonej aplikacji. Jest to jednak bardzo pracochłonne zadanie. Sprawdźmy, czy rzeczywiście jest to takie trudne, i oszacujmy, ile możemy zyskać.

Strona 1 z 3
< Poprzednia 1 2 3 Następna >

Słownik

Fraktal oznacza zwykle obiekt samopodobny, tzn. taki, którego części są podobne do całości. Uzyskiwany jest za pomocą stosunkowego kodu prostego. Jego wykonanie zabiera jednak sporo czasu.

RAD (Rapid Application Development) programy do szybkiego przygotowywania złożonych aplikacji z gotowych całych elementów. Zawierają bardzo wygodne środowisko programowania i dostęp do niezwykle dobrych systemów pomocy. Jednak nie zawsze oferują najbardziej optymalny kod.

WEP (Wired Equivalent Privacy) to pierwszy z powszechnie stosowanych systemów szyfrowania transmisji danych w sieciach bezprzewodowych. 128-bitowy WEP wykorzystuje stały klucz 104-bitowy, co powoduje, że może być złamany w ciągu minuty przy wykorzystaniu współczesnych komputerów.

WPA (WiFi Protected Access) to standard szyfrowania stosowany w sieciach bezprzewodowych standardu IEEE 802.11. Dane szyfrowane są z użyciem algorytmu RC4, ze 128-bitowym kluczem i 48-bitowym wektorem inicjującym działania.

Aby napisać dobry program, nie musisz analizować czasu każdego przesyłania danych i konieczności wykonywania każdej operacji. Często łatwiej i efektywniej jest sięgnąć po jedno z narzędzi typu RAD, które wspomagają budowanie aplikacji poprzez udostępnienie gotowych klocków. Wystarczy wybrać odpowiednie obiekty, powiązać je właściwymi relacjami i voilà... Program gra i mruga światełkami.

Jednak każda poważniejsza aplikacja, która ma przyspieszyć pracę człowieka bądź zapewnić mu nieco rozrywki, zawiera fragmenty kodu, których wykonanie trwa zbyt długo. Zgodnie z doświadczeniem programistów 90 proc. czasu działania aplikacji tracone jest w 10 proc. jej kodu. Dlatego odszukanie i zmodyfikowanie tych newralgicznych miejsc jest najważniejsze dla uzyskania szybciej działających aplikacji. W takim przypadku należy sięgnąć po jedno z narzędzi do optymalizacji, np. AMD CodeAnalyst Performance Analyzer lub Intel VTune Performance Analyzer. Pozwalają one odnaleźć zbyt powolne funkcje i podpowiadają, jakie modyfikacje wprowadzić, aby uzyskać sprawniejsze działanie. Po wyszukaniu takich miejsc należy zastanowić się, z których technik optymalizacji można w danym przypadku skorzystać.

Uproszczone algorytmy

Aplikacji napisanej w języku niskiego poziomu (C, C++ czy Assembler) przy przenoszeniu z 32- do 64-bitowego środowiska nie wystarczy przekompilować, aby uzyskać optymalne rezultaty. Przeanalizujmy przykład, w którym mnożymy przez siebie dwie 64-bitowe liczby całkowite.

Jeśli korzystamy z rejestrów 32-bitowych, to musimy wykonać poniższą procedurę.

; Na wejściu:
; [ESP+8]:[ESP+4] - mnożna
; [ESP+16]:[ESP+12] - mnożnik
; Na wyjściu:
; EDX:EAX =
; (mnożna * mnożnik) % 264
; Modyfikuje:
; EAX, ECX, EDX, EFlags
llmul PROC
mov edx, [esp+8] ; mnożna_hi
mov ecx, [esp+16]
; mnożnik_hi
or edx, ecx
; czy jeden z operandów >= 232
mov edx, [esp+12]
; mnożnik_lo
mov eax, [esp+4] ; mnożna_lo
jnz twomul
; Potrzebne dwa mnożenia.
mul edx
; mnożna_lo * mnożnik_lo
ret
; Zakończone, powrót do
; wywołującego.
twomul:
imul edx, [esp+8]
; p3_lo = mnożna_hi * mnożnik_lo
imul ecx, eax
; p2_lo = mnożnik_hi * mnożna_lo
add ecx, edx
; p2_lo + p3_lo
mul dword ptr [esp+12]
; p1 = mnożna_lo * mnożnik_lo
add edx, ecx
; p1 + p2_lo + p3_lo
; - wynik w EDX:EAX
ret
; Zakończone, powrót do
; wywołującego.
llmul ENDP

W efekcie wcześniejsza część wyniku zostanie zwrócona w parze rejestrów EDX:EAX. Korzystając z 64-bitowych rejestrów, cała operacja wymaga jedynie poniższego kodu:

; Mnożenie RAX przez RBX
; 128-bitowy wynik otrzymamy
; w parze RDX:RAX.

imul rbx

Całe mnożenie odbywa się z wykorzystaniem pojedynczej instrukcji. Dodatkowo nie występują tu instrukcje skoków warunkowych, które utrudniają równoległe wykonywanie kodu programu. W przypadku kodu wykonanego na platformie 64-bitowej działanie programu jest szybsze prawie 4-krotnie w porównaniu z wykonaniem kodu na platformie 32-bitowej.


Tagi: programowanie  
Ocena: +++++    (aby ocenić, musisz się zalogować w serwisie)

< Poprzednia 1 2 3 Następna >

Podobne artykuły:

Komentarze:

Redakcja nie ponosi odpowiedzialności za treść komentarzy.
Nikt jeszcze nie skomentował.
Niezalogowany

Aby mieć dostęp do niektórych części serwisu NEXT (np. forum dyskusyjnego, oceny numeru, newslettera), musisz posiadać konto w naszym serwisie. Zachęcamy do darmowej rejestracji!

Jeżeli posiadasz już konto w serwisie, to zaloguj się.