Sztuka tworzenia wydajnego kodu. Przewodnik po zaawansowanych technikach wykorzystywania sprzętu i kompilatorów
SPIS TREŚCI
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
Opinie
Na razie nie ma opinii o produkcie.