Optimization Michał Drobot Technical Art Director Reality Pump
Plan wykładu : Podstawy Podstawy optymizacjiPodstawy optymizacji CPUCPU Load Hit StoreLoad Hit Store ProfilingProfiling Xbox 360Xbox 360 C#C# XNAXNA
Optimizacja Premature optimization is the root of all evil.Premature optimization is the root of all evil. The first rule of program optimization: don't do it. The second rule: don't do it yet.The first rule of program optimization: don't do it. The second rule: don't do it yet.
Optimizacja Przypowieść o przyśpieszaniuPrzypowieść o przyśpieszaniu void PutPixel (int x, int y, unsigned char color) { videoMemory[x + y * 320] = color; }void PutPixel (int x, int y, unsigned char color) { videoMemory[x + y * 320] = color; }
Optimizacja offset = y * 320;offset = y * 320; offset = (y * 256) + (y * 64);offset = (y * 256) + (y * 64); offset = (y << 8) + (y << 6);offset = (y << 8) + (y << 6); Co wykona się szybciej?Co wykona się szybciej?
Optimizacja Nie optymalizujmy jeśli nie musimyNie optymalizujmy jeśli nie musimy Przedwczesna optymizacjaPrzedwczesna optymizacja Czytelność koduCzytelność kodu SkalowalnośćSkalowalność UżytecznośćUżyteczność Kompilatory oraz sprzęt stają się coraz lepszeKompilatory oraz sprzęt stają się coraz lepsze Częściej one za nas zrobią coś lepiejCzęściej one za nas zrobią coś lepiej
Optimizacja Optymalizacja musi mieć uzasadnienieOptymalizacja musi mieć uzasadnienie PrzykładPrzykład Inteligentny kompilator sam wybierze czy lepiej jest dokonać jednego mnożenia czy add i shiftInteligentny kompilator sam wybierze czy lepiej jest dokonać jednego mnożenia czy add i shift Obecna architektura procesorów out-of-order skutecznie ukryje mnożenieObecna architektura procesorów out-of-order skutecznie ukryje mnożenie 3 instrukcje (potencjalnie szybsze) mogą utrudnić tzw. Pipelining3 instrukcje (potencjalnie szybsze) mogą utrudnić tzw. Pipelining W efekcie kod może być wolniejszy na naszą prośbęW efekcie kod może być wolniejszy na naszą prośbę
Optimizacja Podstawą jest znajomość platformyPodstawą jest znajomość platformy Bądź jej zachowańBądź jej zachowań Równie ważna jest znajomość kodu i decyzja względem tego co TRZEBA przyśpieszyćRównie ważna jest znajomość kodu i decyzja względem tego co TRZEBA przyśpieszyć
Optimizacja Odpowiednio dobrana struktura danych, bądź algorytm, zapewni nam większą wydajność niż jakakolwiek optymizacjaOdpowiednio dobrana struktura danych, bądź algorytm, zapewni nam większą wydajność niż jakakolwiek optymizacja Złożoność algorytmuZłożoność algorytmu O(n)O(n) O(log n)O(log n) O(n^2)O(n^2) …
Optimizacja Wybór algorytmu i struktury musi być związany zWybór algorytmu i struktury musi być związany z Częstością użyciaCzęstością użycia Celem użyciaCelem użycia Specyfikacja platformySpecyfikacja platformy Koszt pojedynczej operacji vs. ilość operacjiKoszt pojedynczej operacji vs. ilość operacji Możliwość zrównolegleniaMożliwość zrównoleglenia Oczekiwaną stabilnościąOczekiwaną stabilnością
Optimizacja PrzykładPrzykład QucikSort : O(n log n)QucikSort : O(n log n) MergeSort : O(n log n)MergeSort : O(n log n) HeapSort : O(n log n)HeapSort : O(n log n) Dane mają rozkład losowyDane mają rozkład losowy ArchitekturaArchitektura SIMDSIMD Duży koszt operacji loadDuży koszt operacji load
Optimizacja PrzykładPrzykład Odpowiedź to mergesortOdpowiedź to mergesort Stosunkowo mała liczba odczytów z pamięciStosunkowo mała liczba odczytów z pamięci Możliwość równoległego wykonywaniaMożliwość równoległego wykonywania Osiąga maksimum w środku wysokości drzewa sortowaniaOsiąga maksimum w środku wysokości drzewa sortowania Praktycznie zerowa przy korzeniachPraktycznie zerowa przy korzeniach Łatwa wektoryzacjaŁatwa wektoryzacja Zależna od typu obiektów przechowywanychZależna od typu obiektów przechowywanych
Optimizacja PrzykładPrzykład Odpowiedź to mergesortOdpowiedź to mergesort Stosunkowo mała liczba odczytów z pamięciStosunkowo mała liczba odczytów z pamięci Możliwość równoległego wykonywaniaMożliwość równoległego wykonywania Osiąga maksimum w środku wysokości drzewa sortowaniaOsiąga maksimum w środku wysokości drzewa sortowania Praktycznie zerowa przy korzeniachPraktycznie zerowa przy korzeniach Łatwa wektoryzacjaŁatwa wektoryzacja Zależna od typu obiektów przechowywanychZależna od typu obiektów przechowywanych
CPU Dobry kod wymaga znajomości urządzenia, które je wykonujeDobry kod wymaga znajomości urządzenia, które je wykonuje CPUCPU Wiele jednostek wykonawczych z niezależnymi rejestramiWiele jednostek wykonawczych z niezależnymi rejestrami Wspólny strumień komendWspólny strumień komend Brak współdzielenia rejestrówBrak współdzielenia rejestrów Potrzeba ładowania i zapisywania w innym rejestrze jednostki podwykonawczejPotrzeba ładowania i zapisywania w innym rejestrze jednostki podwykonawczej
CPU Out-Of-Order executionOut-Of-Order execution In-Order executionIn-Order execution
CPU int iTime; float fTime; fTime = static_cast (iTime);int iTime; float fTime; fTime = static_cast (iTime);
CPU for (int i=0;i<100;++i) { m_iData++; }for (int i=0;i<100;++i) { m_iData++; } int iData = m_iData; for (int i=0;i<100;++i) { iData++; } m_iData = iData;int iData = m_iData; for (int i=0;i<100;++i) { iData++; } m_iData = iData;
Podsumowanie For more information contact me Slides will be available at Drobot.org
Questions ?