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
|
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.
Ocena: 



(aby ocenić, musisz się zalogować w serwisie)
Podobne artykuły: