\begin{slide}{Code-Optimierungen}

Tony Hoare first said, \\
and Donald Knuth famously repeated, \\
\emph{Premature optimization is the root of all evil.}

\bigskip

\begin{itemize}\itemsep 2pt
\item
  erste Regel für Code-Optimierung: \emph{don't do it \dots}
\item
  zweite Regel: \emph{\dots yet!}
\end{itemize}

\bigskip
\emph{Erst} korrekten Code schreiben,
\emph{dann} Ressourcenverbrauch messen (profiling),\\
dann eventuell kritische Stellen verbessern.

\bigskip
Besser ist natürlich: kritische Stellen vermeiden.
Bibliotheksfunktionen benutzen! 

Die sind nämlich schon optimiert (Ü: sort, binsearch)

\end{slide}

\begin{slide}{Kosten von Algorithmen schätzen}

big-Oh-Notation zum Vergleich des Wachstums von Funktionen kennen
und anwenden
\begin{itemize} \itemsep 2pt
\item
  einfache Schleife
\item
  geschachtelte Schleifen
\item
  binäres Teilen
\item
  (binäres) Teilen und Zusammenfügen
\item
  Kombinatorische Explosion
\end{itemize}
(diese Liste aus Pragmatic Programmer, p. 180)

\bigskip
die asymptotischen Laufzeiten lassen sich
durch lokale Optimierungen \emph{nicht} ändern,
also: vorher nachdenken lohnt sich

\end{slide}

\begin{slide}{Code-Transformationen zur Optimierung}

(Jon Bentley: Programming Pearls, {\small ACM Press, 1985, 1999})

\begin{itemize} \itemsep 2pt
\item
  Zeit sparen auf Kosten des Platzes:
  \begin{itemize}
  \item
    Datenstrukturen anreichern (Komponenten hinzufügen)
  \item
    Zwischenergebnisse speichern
  \item
    Cache für häufig benutzte Objekte
  \end{itemize}
\item
  Platz sparen auf Kosten der Zeit:
  \begin{itemize}
  \item
    Daten packen 
  \item
    Sprache/Interpreter (Bsp: Vektorgrafik statt Pixel)
  \end{itemize}
\item
  Schleifen-Akrobatik, Unterprogramme auflösen usw.
  überlassen wir mal lieber dem Compiler/der (virtuellen) Maschine
\end{itemize}




\end{slide}


\begin{slide}{Gefährliche \glqq Optimierungen\grqq}

Gefahr besteht immer, wenn die Programm-Struktur
anders als die Denk-Struktur ist.

\begin{itemize}\itemsep 2pt
\item
  anwendungsspezifische Datentypen vermieden
  bzw. ausgepackt $\to$ primitive obsession

  (Indikator: String und int)
\item
  existierende Frameworks ignoriert

  (Indikatoren: kein import java.util.*;
  sort selbst geschrieben, XML-Dokument als String)
\item
  Unterprogramm vermieden bzw. aufgelöst
  $\to$ zu lange Methode (bei 5 Zeilen ist Schluß)
\end{itemize}


(später ausführlicher bei \emph{code smells} $\to$ Refactoring)

\end{slide}
