[ Pobierz całość w formacie PDF ]
.JeÅ›li dopuszczalne liczby wejÅ›ciowe sÄ… ograniczone z góry, możemy odrazu stwierdzić, ile czasu zajmie wykonywanie naszego kodu.JeÅ›li te wartoÅ›cizależą od czynników zewnÄ™trznych (na przykÅ‚ad liczby rekordów zwróconychprzez plik wsadowy uruchamiany na noc czy liczby nazwisk na liÅ›cie klientów),być może powinniÅ›my skoncentrować siÄ™ raczej na maksymalnym akcepto-wanym czasie dziaÅ‚ania lub na maksymalnym dopuszczalnym poziomie wyko-rzystania pamiÄ™ci.WSKAZÓWKA NR 45Należy szacować rzÄ™dy wielkoÅ›ci algorytmów.IstniejÄ… pewne techniki, które można z powodzeniem wykorzystywać do rozwiÄ…-zywania potencjalnych problemów.JeÅ›li zÅ‚ożoność naszego algorytmu wynosiO(n2), warto podjąć próbÄ™ zastosowania techniki dziel i zwyciężaj , aby obniżyćtÄ™ zÅ‚ożoność do O(n lg(n)).JeÅ›li nie jesteÅ›my pewni, ile czasu potrzeba na wykonanie naszego kodu lubile pamiÄ™ci wykorzysta nasz kod, wystarczy to sprawdzić, przeprowadzajÄ…ceksperymenty przy różnej liczbie rekordów wejÅ›ciowych (lub różnych warto-Å›ciach dowolnego innego parametru, który prawdopodobnie bÄ™dzie miaÅ‚ wpÅ‚ywna czas dziaÅ‚ania algorytmu).Warto nastÄ™pnie nanieść wyniki na wykres.KsztaÅ‚t tak tworzonego wykresu dość szybko powinien nam zasugerować fak-tycznÄ… zÅ‚ożoność.Czy mamy do czynienia z krzywÄ… rosnÄ…cÄ…, prostÄ…, czy możekrzywÄ… dążącÄ… do jakiejÅ› wartoÅ›ci staÅ‚ej (przy rosnÄ…cej iloÅ›ci danych wejÅ›cio-wych)? Trzy lub cztery pomiary powinny wystarczyć.Warto też testować rozwiÄ…zania stosowane w samym kodzie.Dla odpowiedniomaÅ‚ych wartoÅ›ci n prosta pÄ™tla o zÅ‚ożonoÅ›ci O(n2) może dziaÅ‚ać dużo szybciej odskomplikowanej pÄ™tli o zÅ‚ożonoÅ›ci O(n lg(n)), szczególnie jeÅ›li algorytm O(n lg(n))zawiera kosztownÄ… pÄ™tlÄ™ wewnÄ™trznÄ….Opisana teoria nie powinna przesÅ‚aniać nam praktycznych aspektów szybkoÅ›cialgorytmów.Wzrost czasu wykonywania może sprawiać wrażenie liniowego dlastosunkowo niedużych zbiorów danych wejÅ›ciowych.Wystarczy jednak użyć tegosamego kodu do przetworzenia milionów rekordów, aby czas dziaÅ‚ania wydÅ‚użyÅ‚siÄ™ do tego stopnia, że wydajność caÅ‚ego systemu bÄ™dzie nie do zaakceptowania.198 uð RozdziaÅ‚ 6.Kiedy kodujemy&JeÅ›li testujemy procedurÄ™ sortujÄ…cÄ…, która operuje na losowych kluczach wej-Å›ciowych, możemy być pozytywnie zaskoczeni czasem dziaÅ‚ania w razie napo-tkania już uporzÄ…dkowanych danych.Pragmatyczni programiÅ›ci starajÄ… siÄ™ pa-miÄ™tać zarówno o podstawach teoretycznych, jak i ich wymiarze praktycznym.Po przeprowadzeniu wszystkich tych szacunków jedynym naprawdÄ™ istotnymwnioskiem jest szybkość naszego kodu wykonywanego w Å›rodowisku produkcyj-nym na prawdziwych danych2.W ten sposób dochodzimy do kolejnej wskazówki.WSKAZÓWKA NR 46Należy testować swoje szacunki.JeÅ›li uzyskanie precyzyjnych szacunków jest zbyt trudne, warto użyć mecha-nizmów profilowania kodu do okreÅ›lenia liczby wykonaÅ„ poszczególnych kro-ków algorytmu i nanieść te wartoÅ›ci na wykres uwzglÄ™dniajÄ…cy ilość danychwejÅ›ciowych.Najlepsze nie zawsze jest najlepszePragmatyzm musimy wykazywać także na etapie doboru wÅ‚aÅ›ciwych algoryt-mów najszybszy algorytm nie we wszystkich przypadkach jest najlepszy.Dla niewielkiego zbioru wejÅ›ciowego proste sortowanie przez wstawianie bÄ™dzierównie efektywne jak sortowanie szybkie, a jednoczeÅ›nie bÄ™dzie Å‚atwiejsze dozaimplementowania i przetestowania.Warto też zachować daleko idÄ…cÄ… ostroż-ność, jeÅ›li interesujÄ…cy algorytm wiąże siÄ™ z dużymi kosztami na etapie ini-cjalizacji.W przypadku niedużych zbiorów wejÅ›ciowych czas samej inicjalizacjimoże przekroczyć czas wÅ‚aÅ›ciwego dziaÅ‚ania algorytmu (w takim przypadkunależy szukać innych rozwiÄ…zaÅ„).Ważne jest także unikanie pochopnych decyzji o optymalizacji.Zawsze wartoupewnić siÄ™, że interesujÄ…cy nas algorytm rzeczywiÅ›cie jest wÄ…skim gardÅ‚em, za-nim zdecydujemy siÄ™ poÅ›wiÄ™cić swój cenny czas na doskonalenie tego algorytmu.Pokrewne podrozdziaÅ‚ylð Szacowanie w rozdziale 2.Wyzwanialð Każdy programista powinien wiedzieć, jak należy projektować i analizo-wać algorytmy.Robert Sedgewick napisaÅ‚ seriÄ™ książek wprowadzajÄ…cychte zagadnienia w wyjÄ…tkowo przejrzysty sposób ([Sed83, SF96, Sed92]2Podczas testowania algorytmów sortowania użytych na potrzeby ćwiczeÅ„ dla tego pod-rozdziaÅ‚u na komputerze Pentium z 64 MB pamiÄ™ci operacyjnej autorzy wyczerpalidostÄ™pnÄ… pamięć fizycznÄ… już przy sortowaniu siedmiu milionów liczb metodÄ… sortowaniapozycyjnego.Kiedy algorytm sortowania zaczÄ…Å‚ korzystać z przestrzeni wymiany, jegowydajność ulegÅ‚a dodatkowemu, dramatycznemu pogorszeniu.Szybkość algorytmu tð 199i inne).ZachÄ™camy do wÅ‚Ä…czenia którejÅ› z tych pozycji do wÅ‚asnej biblio-teki oraz jej uważnÄ… lekturÄ™.lð Czytelnicy, którzy szukajÄ… bardziej wyczerpujÄ…cych materiałów na tentemat, powinni siÄ™gnąć po książki Sztuka programowania Donalda Knu-tha, w których szczegółowo przeanalizowano najróżniejsze algorytmy[Knu97a, Knu97b, Knu98].lð W ćwiczeniu 34.przyjrzymy siÄ™ problemowi sortowania tablic dÅ‚ugich liczbcaÅ‚kowitych.Jaki wpÅ‚yw na szybkość dziaÅ‚ania algorytmu majÄ… bardziejzÅ‚ożone klucze? Jaki wpÅ‚yw na Å‚Ä…cznÄ… wydajność algorytmu majÄ… kosz-towne operacje porównywania kluczy? Czy struktura klucza wpÅ‚ywa naefektywność algorytmów sortujÄ…cych, czy też jeden algorytm zawsze jestnajszybszy?wiczenia34.OpracowaliÅ›my kilka prostych funkcji sortujÄ…cych, których kod można po- Patrzodpowiedz 34.brać z naszej witryny internetowej (www.pragmaticprogrammer.com).Za-w dodatku B.chÄ™camy do uruchomienia tego kodu na różnych komputerach.Czy Twojewykresy pasujÄ… ksztaÅ‚tem do oczekiwanych krzywych? Do jakich wnioskówmożna dojść na podstawie wzglÄ™dnej szybkoÅ›ci testowych komputerów?Jaki wpÅ‚yw na wyniki majÄ… rozmaite ustawienia optymalizacji kompilato-rów? Czy algorytm sortowania pozycyjnego rzeczywiÅ›cie jest liniowy?35.Poniższa funkcja wyÅ›wietla zawartość drzewa binarnego.Ile (w przybliżeniu) Patrzodpowiedz 35
[ Pobierz całość w formacie PDF ]