PROE wykład 8 biblioteki programistyczne, optymalizacja, inne... dr inż. Jacek Naruniec

Podobne dokumenty
PROE wykład 9 C++11, rzutowanie, optymalizacja. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Wprowadzenie do biblioteki klas C++

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Wprowadzenie do środowiska Qt Creator

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Szablony klas, zastosowanie szablonów w programach

Programowanie w języku C++ Grażyna Koba

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

1.Wstęp. 2.Generowanie systemu w EDK

PROE wykład 4 pozostałe operatory, forward declaration, dziedziczenie. dr inż. Jacek Naruniec

Wstęp do programowania

Instrukcja laboratoryjna cz.3

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Programowanie niskopoziomowe

Informatyka II. Laboratorium Aplikacja okienkowa

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Kompilator języka C na procesor 8051 RC51 implementacja

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Wykład 9: Polimorfizm i klasy wirtualne

Podstawy programowania. Wprowadzenie

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

7. Pętle for. Przykłady

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Programowanie Równoległe Wykład, CUDA praktycznie 1. Maciej Matyka Instytut Fizyki Teoretycznej

Nowoczesny C++ Rafał Wasilewski 1

Wykład 8: klasy cz. 4

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 1. Wprowadzenie, środowisko programistyczne, pierwsze programy

Programowanie w języku C++

Programowanie w języku Python. Grażyna Koba

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Podstawy programowania skrót z wykładów:

PROE wykład 1. dr inż. Jacek Naruniec

C++ Przeładowanie operatorów i wzorce w klasach

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie obiektowe i C++ dla matematyków

Podstawy Programowania

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Szablony funkcji i klas (templates)

Delphi podstawy programowania. Środowisko Delphi

Zmienne, stałe i operatory

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Baza danych sql. 1. Wprowadzenie

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

Rozdział 4 KLASY, OBIEKTY, METODY

Zacznij Tu! Poznaj Microsoft Visual Basic. Michael Halvorson. Przekład: Joanna Zatorska

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

I. WSTĘP. Przykład 1. Przykład 2. Programowanie czyli tworzenie programów komputerowych (aplikacji komputerowych)

Utworzenie pliku. Dowiesz się:

Języki i techniki programowania Ćwiczenia 2

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Zaawansowane programowanie w języku C++ Klasy w C++

weblsp Wybór przeglądarki i jej ustawienia Instrukcja ADH-Soft sp. z o.o., ul. 17 Stycznia 74, Warszawa

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Warsztaty AVR. Instalacja i konfiguracja środowiska Eclipse dla mikrokontrolerów AVR. Dariusz Wika

Java jako język programowania

1 Podstawy c++ w pigułce.

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Programowanie Niskopoziomowe

Wprowadzenie do programowania

Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści

Tablice i funkcje. Marcin Makowski. 26 listopada Zak lad Chemii Teoretycznej UJ

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Wykład 1: Wskaźniki i zmienne dynamiczne

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

Transkrypt:

PROE wykład 8 biblioteki programistyczne, optymalizacja, inne... dr inż. Jacek Naruniec

Biblioteki programistyczne Biblioteki programistyczne pozwalają na: Stworzenie bardziej modułowego kodu. Korzystanie z kodów napisanych przez inne osoby. Łatwiejszą aktualizację programów. Są to osobne pliki zawierające określone funkcjonalności/obiekty. Główny podział bibliotek to: statyczne dynamiczne

Biblioteki programistyczne Biblioteki statyczne W środowisku Windows zwykle z rozszerzenie.lib, w Linux zwykle.a lub.o z nazwą zaczynającą się na lib. Dołącza się je do programu w momencie kompilacji (a dokładniej w momencie linkowania opcje linkera). Zmiana wersji/aktualizacja biblioteki wymaga ponownej kompilacji całej aplikacji. Powodują zwiększenie objętości pliku wykonywalnego.

Biblioteki programistyczne Biblioteki dynamiczne Zwykle z rozszerzeniem.dll w środowisku Windows, z rozszerzeniem.so w Linux. Są ładowane do pamięci w czasie uruchomienia programu, a w czasie kompilacji definiowane są tylko parametry funkcji i nazwa pliku. Zmiana wersji/aktualizacja biblioteki, przy dobrej organizacji programu, wymaga jedynie podmiany pliku biblioteki dynamicznej.

Biblioteka statyczna Jak wygląda kod kiedy tworzymy własną bibliotekę? Jak normalny kod C++, ale nie ma maina! Z tego kodu wygenerujemy plik.lib a nie.exe libmoja.cpp: libmoja.h:

Biblioteka statyczna W ustawieniach projektu musimy zmienić właściwości tak, aby program kompilował się do pliku lib.

Biblioteka statyczna Standardowo bibliotekom skompilowanym w trybie Debug dodaje się na końcu nazwy pliku literę D, czyli libmojad.lib Po wygenerowaniu pliku lib możemy naszą bibliotekę wykorzystać w innym projekcie. W tym celu kopiujemy plik lib i jedynie pliki nagłówkowe biblioteki do naszego nowego projektu. Następnie ustawiamy opcje linkera tak, aby dodawał on plik lib do naszego projektu

Biblioteka statyczna Należy także dodać katalog, w którym umieścimy wszystkie pliki nagłówkowe biblioteki. Zazwyczaj taki katalog nazwany jest include.

Biblioteka statyczna Teraz możemy spokojnie wykorzystać naszą bibliotekę w nowym programie (to jedyna treść całego programu, wszystko jest już zaimplementowane w bibliotece!):

Biblioteka dynamiczna W przypadku bibliotek dynamicznych musimy wskazać które funkcje będą wyeksportowane do biblioteki dynamicznej. Po ustawieniu elementu docelowego jako dll otrzymamy 2 pliki -.lib i.dll

Biblioteka dynamiczna W aplikacji w której wykorzystujemy bibliotekę dołączamy stworzony plik lib (jak w przypadku statycznej), a do folderu projektu przegrywamy plik dll.

Biblioteka dynamiczna Stwórzmy teraz nową wersję biblioteki (żeby pokazać jak łatwa jest aktualizacja): I podmieniamy jedynie plik dll i uruchamiamy program jeszcze raz, bez ponownej kompilacji.

Assert Kontrola poprawności aplikacji. Wykonuje się jedynie w trybie Debug (czyli deweloperskim). Jeśli warunek w funkcji nie jest spełniony, to wyświetlana jest linijka w której wystąpił błąd. Jeśli warunek jest spełniony, to funkcja nie wykonuje żadnej akcji.

Assert W trybie release (z optymalizacją) funkcja assert jest ignorowana przez kompilator (niezależnie od spełnienia warunku, program wykonuje się dalej).

C++11 (C++0x) Nowy standard języka C++ Wprowadzony w 2011 roku. Założenia (m.in.): Ma być zgodny z poprzednim standardem. Ma ułatwić programowanie i naukę programowania C++ (m.in. wprowadzenie wielu elementów istniejących w innych językach programowania) Ma preferować rozszerzenia nad zmianą bazy języka. W chwili obecnej obsługiwany przez znaczną większość kompilatorów.

Nowe typy danych long long, unsigned long long (64 bitowe). char16_t, char32_t 16 i 32 bitowe reprezentacje znaków (np. do przechowywania znaków w UTF16 i UTF32) surowy napis (bez interpretacji), po cudzysłowie muszą być nawiasy:

Nowe metody inicjalizacji Obiekty inicjalizowane zwykle nie nawiasami () a {}. Inicjalizacja nie wymaga znaku =.

Nowe metody inicjalizacji Inicjalizacja obiektów (wywołanie konstruktora z parametrem):

Nowe metody inicjalizacji Wygodna inicjalizacja wartości domyślnych składowych klasy:

Nowe typy deklaracji auto automatyczny dobór typu zmiennej w zależności od inicjalizacji:

Nowe typy deklaracji decltype nadanie zmiennej typu odpowiadającego typowi podanej zmiennej

Nowe typy deklaracji Nowa składnia definiowania typu zwracanej zmiennej (trailing return) parametr zwracany definiowany jest na końcu funkcji: oznacza dokładnie to samo Niedopuszczalne! bo d nie jest jeszcze znane kompilatorowi Poprawne! d jest przed decltype

NULL nullptr stosowany zamiast NULL. Oznacza rzeczywiście wskaźnik nie wskazujący na żadne dane, a nie wartość (np. 0). Pomaga uniknąć niektórych błędnych zapisów. Nie zadziała, bo próbujemy przypisać wskaźnik do liczby Zadziała, bo próbujemy przypisać liczbę do liczby

NULL

Inteligentne wskaźniki (smart pointers) Wspomaga proces zarządzania pamięcią (tworzenia/usuwania zmiennych dynamicznych). Inteligentne wskaźniki zachowują się jak wskaźniki, ale posiadają kilka rozszerzeń. Jest kilka typów inteligentnych wskaźników, m.in. auto_ptr już przedawniony unique_ptr ulepszony auto_ptr shared_ptr wskaźnik z licznikiem wskaźników wskazujących na tę samą informację

Inteligentne wskaźniki Obiekty zaalokowane dynamicznie są automatycznie usuwane po usunięciu obiektu auto_ptr. auto_ptr jest klasą, która ma konstruktory, destruktor itp. Nie obsługuje tablic (delete, nie delete[]).

Inteligentne wskaźniki Przypisanie inteligentnego wskaźnika auto_ptr powoduje zmianę jego właściciela : Ten wskaźnik na nic nie wskazuje, bo został przejęty.

Inteligentne wskaźniki unique_pointer Błąd na etapie kompilacji a nie uruchomieniu. Obsługuje tablice (delete[]). Może być przenoszony (o konstruktorach przenoszących na dalszych slajdach), czyli np. zwracany w miejscach, gdzie unique_ptr jest zmienną tymczasową. Nie może być zwyczajnie kopiowany. Może być przekazany pod inny unique_ptr poprzez funkcję swap.

Inteligentne wskaźniki shared_ptr zlicza liczbą elementów wskazujących na to samo miejsce. Obiekt usuwa się po wyzerowaniu licznika.

Enumerate zakresowy Zmienne wyliczeniowe mogą odnosić się do konkretnego zakresu:

lvalues, rvalues Aby wprowadzić efektywną metodę przenoszenia elementów należy zapoznać się z dwiema rodzajami elementów lvalue i rvalue. Nieformalna definicja 1: lvalue to taki element, który może występować zarówno po lewej jak i po prawej stronie równania (a1=a2 i a2=a1 to znaczy, że a1 i a2 to lvalue) Rvalue to taki element, który może występować tylko po prawej stronie równania (a1=2 ale nie 2=a1)

lvalues, rvalues Nieformalna definicja 2: Z lvalue możemy pobrać adres (int a1; b = &a1, więc a1 jest lvalue) Z rvalue nie możemy pobrać adresu np. z a+b, bo jest to obiekt tymczasowy np. z liczby (nie może być a = &2)

lvalue, rvalue Do lvalue odnosi się taka referencja jaką znamy (&), natomiast do rvalue - &&: do 2 i do wyniku i+i nie pobierzemy adresu

Konstruktor przenoszący Po co nam l i rvalue? Przyjmijmy prosty obiekt: dynamicznie alokowana tablica znaków

Konstruktor przenoszący Dodajmy konstruktor kopiujący i wykorzystajmy klasę:

Konstruktor przenoszący Jak widać przy operatorze + następuje stworzenie obiektu tymczasowego a potem jego kopiowanie (i całej tablicy). A gdyby zamiast kopiowania całego obiektu skopiować jedynie zmienne niewskaźnikowe, natomiast wskaźniki jedynie przekazać nowemu obiektowi? Tymczasowy obiekt i tak się skasuje, wskaźnik mu już niepotrzebny Operator + zwraca obiekt typu rvalue, więc stwórzmy dla niego specjalny konstruktor kopiujący: 1. Skopiowanie wskaźnika na tablicę z obiektu tymczasowego do aktualnego. 2. Ustawienie wskaźnika obiektu tymczasowego na nullptr dzięki temu destruktor obiektu tymczasowego go nie skasuje!

Konstruktor przenoszący Efekt? Nie kopiujemy tablicy a jedynie wskaźniki na tablice! Daje to ogromny wzrost wydajności. Nowy obiekt kradnie tablicę. Poprzednio: rvalue Teraz:

std::move Funkcja move określa, że zmienna może zostać przeniesiona operatorem przenoszącym (która domyślnie byłaby zwyczajnie skopiowana) napis pozostał niezmieniony wskaźnik na ciąg został zmieniony, nie możemy już z niego korzystać

C++11 Inne istotne elementy standardu: Wątki (wreszcie!) Default (domyślne funkcje, konstruktory, funkcja = delete zakazanie używania metody (np. operatora przypisania) Delegaci wykonanie w konstruktorze treści innego konstruktora tak, aby nie powielać kodu Wyrażenia regularne, Inne

Optymalizacja kodu C++ Metoda optymalizacji zależy od jej celu. Zwykle jest to poprawa wydajności (szybkości) aplikacji zmniejszenie ilości zajmowanej pamięci poprawa przejrzystości, modułowości kodu Na wykładzie zajmiemy się poprawą wydajności aplikacji.

Tryby debug/release Pierwszy krok tryb debug służy jedynie procesom deweloperskim. Innymi słowy: Kod debug jest znacznie wolniejszy od release, Program stworzony w trybie debug w wielu przypadkach nie uruchomi się na innych komputerach (np. przy VS wymaga obecności bibliotek VS na uruchamianym komputerze)

Tryby debug/release W trybie release kod jest optymalizowany, co uniemożliwia w większości przypadków podglądanie zmiennych. Poszukiwanie błędów można sobie umożliwić poprzez komunikaty kontrolne albo wypisywanie informacji do pliku. Coś co uruchamia się poprawnie w debug nie musi uruchamiać się poprawnie w release (po zoptymalizowaniu mogą ujawnić się błędy implementacji). Ogólnie każdy program finalnie powinniśmy uruchamiać w trybie release.

Opcje preprocesora Często mamy możliwość wybrania odpowiednich opcji kompilacji w zależności od zapotrzebowania/sprzętu: preferencja małego lub szybkiego kodu, Wykorzystanie operacji wektorowych procesora (np. SSE), Optymalizacja pod względem funkcji inline Opcje te zwykle ustawiane są w opcjach projektu (W VS zakładki C++->Optimization i C++->Code generation)

Funkcje inline Ciało funkcji oznaczonych jako inline są przez kompilator wstawiane w miejsce wywołania. Kompilator nie musi respektować naszego życzenia Zwykle w procesie optymalizacji kompilator sam najlepiej określa które funkcje powinny być inline.

Podział zadań na wiele wątków We współczesnych komputerach mamy zwykle więcej niż jeden procesor. Możemy z nich korzystać wywołując kilka niezależnych programów: Procesor 1 Procesor 2 Procesor 3 Edytor Przeglądarka Film Procesor 4

Podział zadań na wiele wątków Jeśli na jednym procesorze wykonywanych jest więcej niż jeden program (proces), to wtedy system dysponuje po kawałku czasu procesora dla każdego programu. Możemy także wykonywać nasz jeden program na kilku procesorach Przykład - mamy aplikację wyszukującą w danym ciągu znaków określoną sekwencję (w praktyce miałoby to sens gdyby ciąg był bardzo długi): ABCDFADCACBCBABABCBDBACBABABAB Dzielimy tekst na 4 podzbiory i każemy każdemu procesorowi zająć się jednym fragmentem: ABCDFADCACBCBABABCBDBACBABABAB Procesor 1 Procesor 3 Procesor 2 Procesor 4

Podział zadań na wiele wątków Na koniec uwspólniamy wyniki wyszukiwania Teoretycznie przetwarzanie powinno być 4x szybsze (chociaż w praktyce wyjdzie mniej) Do tworzenia i zarządzania takimi osobnymi podprogramami (a dokładniej wątkami) są już w każdym środowisku gotowe narzędzia. Można także przeprowadzać obliczenia na całych klastrach komputerów. C++11 wprowadziło klasę thread do zarządzania wątkami. Można wykorzystać narzędzia działające z automatu (jak np. OpenMP)

Podział na wiele wątków wersja ekstremalna Wykorzystanie kart graficznych ostatnio bardzo popularny sposób zwiększenia wydajności, w szczególności w: Grach. Przetwarzaniu obrazu. Badaniach naukowych. Dlaczego jest to dobre? [źródło: NVIDIA CUDA C Programming Guide]

Podział na wiele wątków wersja ekstremalna Pytanie to dlaczego nie używamy tego do wszystkiego? [źródło: NVIDIA CUDA C Programming Guide]

Podział na wiele wątków wersja ekstremalna GPU (Graphical Processing Unit) jest zorientowane na dużą ilość przetwarzania przy minimalnej ilości operacji sekwencyjnych. Dostęp do pamięci musi odbywać się w sposób zorganizowany. [źródło: NVIDIA CUDA C Programming Guide]

Programowanie GPU Jest wiele technik pozwalających na programowanie GPU, np: shadery w potoku generowania obrazu, CUDA (Nvidia), OpenCl (teoretycznie ATI i Nvidia i dowolne inne urządzenia, Open Computing Language) C++ AMP Na chwilę obecną najpopularniejsza i najlepiej rozwinięta jest CUDA (Compute Unified Device Architecture)

Profiler Profilery są niesamowicie użyteczne przy wykrywaniu wąskich gardeł programów. Zwykle zatrzymują program co pewien okres czasu (np. co 50 mikrosekund) i sprawdzają w której funkcji aktualnie znajduje się program. Otrzymane wartości są sumowane. W Visual Studio wybieramy Analyze->Launch Performance Wizard (opcja dostępna w wybranych wersjach VS).

Profiler Ewidentnie widać, że wąskie gardło jest w destruktorze!

Profiler Klikamy dalej na funkcję zwrocwskaznikwezla:

Profiler Widać, że błędem jest przechodzenie od ostatniego węzła, bo wtedy wiele razy uruchamia się wspomniana funkcja! Zmieńmy nasz destruktor:

Profiler Program wykonał się 2x szybciej!

Profiler Pójdźmy dalej poprawmy push_back tak, aby nie trzeba było za każdym razem przechodzić przez wszystkie elementy. Jak? przecież można trzymać też wskaźnik na ostatni element! Nasza lista byłaby efektywna przy dodawaniu na początek listy.

Profiler Przyspieszyliśmy nasz program do niecałej 1.5 sekundy, tj. ok. 5 razy! Można dalej? To już zależy od tego czego potrzebujemy modułowość/prostota/szybkość.

Inne metody optymalizacji Przy obliczeniach/algorytmach itp. pierwszą rzeczą zawsze jest poszukiwanie zysku szybkości w samym algorytmie. Czy wszystkie kroki trzeba wykonywać? Czy można gdzieś oszczędzić? Czy można przeorganizować kod aby był efektywniejszy? Można próbować pisania kodu asemblerowego zwykle kończy się tym, że kompilator potrafi zrobić to lepiej od nas. Kompilator nie będzie myślał za nas zoptymalizuje tylko kod który mu dostarczyliśmy.

Ankiety! studia.elka.pw.edu.pl