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


  1. Mierzymy wydajność programu (szukając wąskiego gardła)
  2. Usuwamy wąskie gardło 
  3. 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