 C++ jest wyjątkowym językiem programowania, bo umożliwia pisanie zwięzłego, stabilnego kodu, który można zoptymalizować pod kątem wydajności w niespotykanym dotychczas stopniu. Do tego w standardzie C++ 20 znalazło się sporo mechanizmów, które pozwolą Ci osiągnąć wysoką efektywność kodu, a równocześnie uprzyjemniają Twoją pracę 😉 ⌨️ Chcesz dowiedzieć się więcej na ten temat? Sięgnij po "Wysoce wydajny C++. Opanuj sztukę optymalizowania działania kodu. Wydanie II" 🆕 Publikacja jest drugim, zaktualizowanym i uzupełnionym wydaniem przewodnika dla programistów. Rozpoczyna się od szczegółowego wprowadzenia do nowoczesnego C++ z uwzględnieniem technik eliminowania wąskich gardeł w kodzie bazowym. Następnie omówiono zagadnienia optymalizacji struktur danych i zarzadzania pamięcią. Przedstawiono również tematykę algorytmów, zasady pisania czytelnego kodu i stosowania niestandardowych iteratorów. Zamieszczono w niej też praktyczne przykłady używania metaprogramowania w języku C++, korutyn, refleksji (do ograniczenia ilości szablonowego kodu), obiektów pośredniczących (do wprowadzania ukrytych optymalizacji), programowania współbieżnego i struktur danych wolnych od blokad. W końcowej części dokonano przeglądu algorytmów równoległych w C++. W książce między innymi: 🔸 nowe aspekty C++ 20 🔸 wyspecjalizowane struktury danych na potrzeby wydajnego kodu 🔸 metaprogramowanie i niestandardowe zarządzanie pamięcią 🔸 mechanizm refleksji i programowanie współbieżne bez używania blokad 🔸 subtelne optymalizacje algorytmów z biblioteki standardowej C++ 🔸 leniwe generatory i zadania asynchroniczne Złożoność asymptotyczna i notacja dużego O Zwykle istnieje więcej niż jeden sposób na rozwiązanie problemu, a jeśli wydajność jest istotna, należy najpierw skoncentrować się na wysokopoziomowych optymalizacjach, wybierając odpowiednie algorytmy i struktury danych. Przydatnym sposobem oceny i porównywania algorytmów jest analiza ich asymptotycznej złożoności obliczeniowej, czyli tego, jak czas wykonywania lub zużycie pamięci rosną, gdy rośnie wielkość danych wejściowych. Ponadto w bibliotece standardowej języka C++ określona jest złożoność asymptotyczna wszystkich kontenerów i algorytmów, co oznacza, że podstawowa znajomość omawianych tu tematów jest niezbędna do korzystania z tej biblioteki. Jeśli już dobrze rozumiesz złożoność algorytmów i notację dużego O, możesz swobodnie pominąć ten podrozdział. Zaczniemy od przykładu. Załóżmy, że chcesz napisać algorytm, który zwraca wartość true, jeśli znajdzie określony klucz w tablicy, a w przeciwnym razie zwraca wartość false. Aby sprawdzić, jak ten algorytm działa dla tablic o różnej wielkości, należy przeanalizować czas wykonywania go jako funkcję od wielkości danych wejściowych:
 Jest to prosty algorytm. Iteracyjnie pobiera elementy tablicy i porównuje każdy z nich z szukanym kluczem. Jeśli masz szczęście, algorytm znajdzie klucz na początku tablicy i natychmiast zwróci sterowanie. Możliwe jednak, że trzeba będzie sprawdzić w pętli całą tablicę, a klucz w ogóle nie zostanie znaleziony. Jest to przypadek pesymistyczny dla algorytmu i zwykle to właśnie taki scenariusz należy przeanalizować. Co się jednak dzieje z czasem wykonywania, gdy wielkość danych wejściowych rośnie? Sprawdź ostatnie NOWOŚCI 🆕👇 Dogadzamy sobie dłużej - promocja trwa! 🍽️🍩😉🕮  |