Szczegóły ebooka

Sztuka tworzenia wydajnego kodu. Przewodnik po zaawansowanych technikach wykorzystywania sprzętu i kompilatorów

Sztuka tworzenia wydajnego kodu. Przewodnik po zaawansowanych technikach wykorzystywania sprzętu i kompilatorów

Fedor G. Pikus

Ebook

Jeszcze kilka lat temu, by zwiększyć szybkość działania programu, wystarczyło wymienić procesor. Dzisiejsze procesory nie są znacząco szybsze od poprzedników. Nowsze architektury zapewniają zaledwie niewielkie przyrosty wydajności istniejących już programów. Nie ma innego wyjścia: jeśli programista chce tworzyć efektywne oprogramowanie, musi wiedzieć, jak odpowiednio używać dostępnych zasobów obliczeniowych. Jest to trudna sztuka, wymagająca ciągłej gotowości do nauki.

To książka przeznaczona dla doświadczonych programistów, którzy chcą sprawnie tworzyć efektywny kod. Omówiono w niej, jak korzystać z zasobów procesora i pamięci, unikać zbędnych obliczeń, mierzyć wydajność kodu i prawidłowo stosować współbieżność i wielowątkowość. Zaprezentowano również zagadnienia związane z optymalizacjami przeprowadzanymi przez kompilator, a także metody efektywniejszego korzystania z właściwości języka programowania (C++). Dokładnie wyjaśniono zasady projektowania oprogramowania pod kątem wydajności i aby ułatwić przyswajanie wiedzy, zamieszczono wiele przykładów, które będą przydatne w czasie samodzielnej nauki. Dzięki dogłębnemu zrozumieniu wiedzy ujętej w książce łatwiej będzie podejmować właściwe decyzje podczas projektowania nowego systemu lub modyfikowania już istniejącej architektury.

Najciekawsze zagadnienia:

  • korzystanie ze sprzętowych zasobów obliczeniowych
  • uporządkowanie pamięci i należyte zorganizowanie danych
  • wydajność operacji a współbieżny dostęp
  • stosowanie technik programowania bez użycia blokady
  • zwiększanie efektywności optymalizacji za pomocą kompilatora
  • interfejsy API dla współbieżnych struktur danych i struktur o dużej wydajności

Dobre decyzje projektowe to klucz do wydajności kodu!

O autorze

O recenzencie

Przedmowa

Część I. Fundamenty wydajności

Rozdział 1. Wydajność i współbieżność - wprowadzenie

  • Dlaczego należy brać pod uwagę wydajność?
  • Dlaczego wydajność ma znaczenie?
  • Co rozumiemy przez wydajność?
    • Wydajność jako przepustowość
    • Wydajność jako pobór mocy
    • Wydajność w przypadku aplikacji czasu rzeczywistego
    • Wydajność w zależności od kontekstu
  • Ocenianie, szacowanie i przewidywanie wydajności
  • Poznawanie zagadnienia dużej wydajności
  • Podsumowanie
  • Pytania

Rozdział 2. Pomiary wydajności

  • Wymagania techniczne
  • Przykład pomiaru wydajności
  • Testy porównawcze wydajności
    • Liczniki czasu biblioteki chrono języka C++
    • Liczniki czasu o dużej dokładności
  • Profilowanie wydajności
    • Narzędzie profilujące perf
    • Szczegółowe profilowanie przy użyciu narzędzia perf
    • Narzędzie profilujące pakietu Google Performance
    • Profilowanie z wykorzystaniem grafu wywołań
    • Optymalizacja i wstawianie
    • Profilowanie w praktyce
  • Mikrotesty porównawcze
    • Podstawy mikrotestów porównawczych
    • Mikrotesty porównawcze i optymalizacje kompilatora
    • Google Benchmark
    • Mikrotesty porównawcze to kłamstwo
  • Podsumowanie
  • Pytania

Rozdział 3. Architektura procesorów, zasoby i wydajność

  • Wymagania techniczne
  • Wydajność zaczyna się od procesora
  • Badanie wydajności za pomocą mikrotestów porównawczych
    • Wizualizacja obliczeń równoległych na poziomie instrukcji
  • Zależności od danych i potokowanie
  • Potokowanie i rozgałęzienia
    • Przewidywanie rozgałęzień
    • Profilowanie pod kątem nieudanego przewidywania rozgałęzień
  • Wykonywanie spekulatywne
  • Optymalizacja złożonych warunków
  • Wykonywanie obliczeń bez rozgałęzień
    • Odwijanie pętli
    • Operacja wyboru bez użycia rozgałęzień
    • Przykłady wykonywania obliczeń bez rozgałęzień
  • Podsumowanie
  • Pytania

Rozdział 4. Architektura i wydajność pamięci

  • Wymagania techniczne
  • Wydajność zaczyna się od procesora, ale na nim się nie kończy
  • Pomiar szybkości dostępu do pamięci
    • Architektura pamięci
    • Pomiar szybkości pamięci głównej i podręcznej
  • Szybkość pamięci - wartości
    • Szybkość operacji losowego dostępu do pamięci
    • Szybkość operacji dostępu sekwencyjnego do pamięci
    • Optymalizacje wydajności pamięci na poziomie sprzętowym
  • Optymalizowanie wydajności pamięci
    • Struktury danych efektywne z perspektywy pamięci
    • Profilowanie wydajności pamięci
    • Optymalizowanie algorytmów pod kątem wydajności pamięci
  • "Duch" w komputerze
    • Czym jest Spectre?
    • Przykład użycia ataku Spectre
    • Atak Spectre w pełni akcji
  • Podsumowanie
  • Pytania

Rozdział 5. Wątki, pamięć i współbieżność

  • Wymagania techniczne
  • Wątki i współbieżność
    • Czym jest wątek?
    • Wielowątkowość symetryczna
    • Wątki i pamięć
    • Programy ograniczane przez pamięć i współbieżność
  • Koszt synchronizacji pamięci
  • Dlaczego współużytkowanie danych jest tak kosztowne?
  • Współbieżność i kolejność
    • Potrzeba zapewnienia kolejności
    • Uporządkowanie pamięci i związane z nią bariery
    • Uporządkowanie pamięci w języku C++
  • Model pamięci
  • Podsumowanie
  • Pytania

Część II. Zaawansowana współbieżność

Rozdział 6. Wydajność i współbieżność

  • Wymagania techniczne
  • Co jest niezbędne do efektywnego korzystania ze współbieżności?
  • Blokady, alternatywy i ich wydajność
    • Programy z blokadą, pozbawione blokady oraz bez oczekiwania
    • Różne blokady w przypadku odmiennych problemów
    • Jaka jest faktyczna różnica między programem z blokadą i programem pozbawionym blokady?
  • Tworzenie bloków pod kątem programowania współbieżnego
    • Podstawy współbieżnych struktur danych
    • Liczniki i akumulatory
    • Protokół publikowania
    • Inteligentne wskaźniki używane w programowaniu współbieżnym
  • Podsumowanie
  • Pytania

Rozdział 7. Struktury danych odpowiednie w przypadku współbieżności

  • Wymagania techniczne
  • Czym jest struktura danych bezpieczna wątkowo?
    • Najlepszy rodzaj bezpieczeństwa wątkowego
    • Rzeczywiste bezpieczeństwo wątkowe
  • Stos bezpieczny wątkowo
    • Projektowanie interfejsu pod kątem bezpieczeństwa wątkowego
    • Wydajność struktur danych chronionych przez muteks
    • Wymagania dotyczące wydajności w przypadku różnych zastosowań
    • Szczegółowa analiza wydajności stosu
    • Oszacowania wydajności w przypadku schematów synchronizacji
    • Stos bez blokady
  • Kolejka bezpieczna wątkowo
    • Kolejka pozbawiona blokady
    • Struktury danych spójne niesekwencyjnie
    • Zarządzanie pamięcią na potrzeby współbieżnych struktur danych
  • Lista bezpieczna wątkowo
    • Lista pozbawiona blokady
  • Podsumowanie
  • Pytania

Rozdział 8. Obsługa współbieżności w języku C++

  • Wymagania techniczne
  • Obsługa współbieżności w standardzie C++11
  • Obsługa współbieżności w standardzie C++17
  • Obsługa współbieżności w standardzie C++20
    • Podstawy dotyczące współprogramów
    • Składnia współprogramów w języku C++
    • Przykłady współprogramów
  • Podsumowanie
  • Pytania

Część III. Projektowanie i pisanie programów o dużej wydajności

Rozdział 9. Kod C++ o dużej wydajności

  • Wymagania techniczne
  • Czym jest efektywność języka programowania?
  • Zbędne kopiowanie
    • Kopiowanie i przekazywanie argumentów
    • Kopiowanie jako technika implementacji
    • Kopiowanie w celu przechowywania danych
    • Kopiowanie wartości zwracanych
    • Zastosowanie wskaźników w celu uniknięcia kopiowania
    • Metoda unikania zbędnego kopiowania
  • Nieefektywne zarządzanie pamięcią
    • Zbędne alokacje pamięci
    • Zarządzanie pamięcią w programach współbieżnych
    • Unikanie fragmentacji pamięci
  • Optymalizacja wykonywania warunkowego
  • Podsumowanie
  • Pytania

Rozdział 10. Optymalizacje kompilatora w kodzie C++

  • Wymagania techniczne
  • Kompilatory optymalizujące kod
    • Podstawy optymalizacji stosowanych przez kompilator
    • Wstawianie funkcji
    • Co tak naprawdę kompilator "wie"?
    • Przenoszenie informacji z fazy wykonywania do fazy kompilacji
  • Podsumowanie
  • Pytania

Rozdział 11. Zachowanie niezdefiniowane i wydajność

  • Wymagania techniczne
  • Czym jest zachowanie niezdefiniowane?
  • Dlaczego występuje zachowanie niezdefiniowane?
  • Zachowanie niezdefiniowane i optymalizacja kodu C++
  • Zastosowanie zachowania niezdefiniowanego do zapewnienia efektywnego projektu
  • Podsumowanie
  • Pytania

Rozdział 12. Projektowanie pod kątem wydajności

  • Interakcja między projektem i wydajnością
  • Projektowanie pod kątem wydajności
    • Zasada minimalnej ilości informacji
    • Zasada maksymalnej ilości informacji
  • Kwestie związane z projektowaniem interfejsu API
    • Projektowanie interfejsu API pod kątem współbieżności
    • Kopiowanie i wysyłanie danych
  • Projektowanie pod kątem optymalnego dostępu do danych
  • Kompromisy związane z wydajnością
    • Projekt interfejsu
    • Projektowanie komponentów
    • Błędy i zachowanie niezdefiniowane
  • Podejmowanie przemyślanych decyzji projektowych
  • Podsumowanie
  • Pytania

Odpowiedzi

  • Tytuł: Sztuka tworzenia wydajnego kodu. Przewodnik po zaawansowanych technikach wykorzystywania sprzętu i kompilatorów
  • Autor: Fedor G. Pikus
  • Tytuł oryginału: The Art of Writing Efficient Programs: An advanced programmer's guide to efficient hardware utilization and compiler optimizations using C++ examples
  • Tłumaczenie: Piotr Pilch
  • ISBN: 978-83-283-9251-9, 9788328392519
  • Data wydania: 2022-10-11
  • Format: Ebook
  • Identyfikator pozycji: szttwo
  • Wydawca: Helion