Przedwczesna optymalizacja
WSZYSTKO CO POWINNIŚCIE WIEDZIEĆ O PROGRAMOWANIU
(a nikt inny wam nie powie)
Powód
Jakiś czas temu, kiedy studenci oddawali mi pierwsze programy a w programie był fragment, który był nieczytelny miał pięć ekranów długości i pięciokrotnie zagnieżdżoną pętlę for,
na moje pytanie: "Czemu to uczyniliście" odpowiedź zawsze brzmiała: "Bo tak jest szybciej"
W tej prezentacji chcę przekonać was że nie warto optymalizować za szybko oraz że czytelność jest warta więcej niż szybkość wykonania.
Przedwczesna optymalizacja
Premature optimization is the root of all evil
Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.
Oba Cytaty: Donald Knuth: "Structured programming with go-to statements"
Analiza kosztów
Koszt godziny pracy programisty: ~100zł
Koszt godziny pracy komputera od 10gr do 10 zł (http://aws.amazon.com/ec2/pricing/)
Jeśli optymalizujecie kawałek kodu przez godzinę, to lepiej żeby zaoszczędził on przynajmniej kilkaset godzin pracy procesora.
Przedwczesna optymalizacja a elastyczność kodu
TCO (Total Cost Of Ownership) oprogramowania:
- 20% napisanie oprogramowania
- 80% utrzymanie oprogramowania
(Preambuła Java Code Conventions)
Nieczytelny kod zwiększa tą koszt utrzymania!
Programs must be written for people to read, and only incidentally for machines to execute.
-Abelson & Sussman, Structure and Interpretation of Computer Programs
Przedwczesna optymalizacja
class G4UserEventAction
{
public:
G4UserEventAction();
virtual ~G4UserEventAction();
inline void SetEventManager(G4EventManager* value) .//<--- Virtual
{ fpEventManager = value; }
public: // with description
virtual void BeginOfEventAction(const G4Event* anEvent);
virtual void EndOfEventAction(const G4Event* anEvent);
// Two virtual method the user can override.
protected:
G4EventManager* fpEventManager;
};
Przedwczesna optymalizacja
- Zmniejsza czytelność kodu
- Zmniejsza elastyczność kodu
- Czasem zmniejsza wydajność kodu
Kiedy warto optymalizować kod
- Kiedy piszecie numeryczny kod, którego czas wykonania wynosi tygodnie
- Kiedy przerabiacie TB danych (do GB nie trzeba ;))
- Czasem optymalny kod musi być kiepsko czytelny
Poprawna optymalizacja
-
Mierzymy wydajność programu (szukając wąskiego gardła)
-
Usuwamy wąskie gardło
- Wróć do 1
-
Wersja optymistyczna: kod będzie szybki
- Wersja pesymistyczna: dostaniecie Uniformly Slow Code.
Optymalizacja w JDK
- Do wyszukiwania problemów z wydajnością służy Java Visual VM
- Dostępne w JDK za pomocą polecenia jvisualvm

Optymalizacja kodu
By Jacek Bzdak
Optymalizacja kodu
- 2,636