Sztuka tworzenia wydajnego kodu. Przewodnik po zaawansowanych technikach wykorzystywania sprz - Helion

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-9250-2
stron: 446, Format: 168x237, okładka: mi
Data wydania: 2022-07-01
Księgarnia: Helion
Cena książki: 57,84 zł (poprzednio: 88,98 zł)
Oszczędzasz: 35% (-31,14 zł)
Osoby które kupowały "Sztuka tworzenia wydajnego kodu. Przewodnik po zaawansowanych technikach wykorzystywania sprz", wybierały także:
- Windows Media Center. Domowe centrum rozrywki 66,67 zł, (8,00 zł -88%)
- 67,73 zł, (14,90 zł -78%)
- Przywództwo w świecie VUCA. Jak być skutecznym liderem w niepewnym środowisku 58,64 zł, (12,90 zł -78%)
- Superinteligencja. Scenariusze, strategie, zagro 67,73 zł, (14,90 zł -78%)
- Lean dla bystrzak 59,60 zł, (14,90 zł -75%)
Spis treści
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