Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:lehre:programmierkonzepte:ss2020:21:index

21. Codeoptimierung

Themen
Motivation
Voraussetzungen
Strategien
Zusammenhang mit „Clean Code“
Folien
PDF
Glossar
PDF
Video
MP4


Webcast

Hinweis: Der Webcast wurde mit Tiny Webcasts for Lecture(r)s erstellt.

Zentrale Aspekte

  • Laufzeit und Ressourcenverbrauch sind in den
    seltensten Fällen ein ernsthaftes Problem.
  • Code sollte nur dann optimiert werden,
    wenn es unumgänglich ist.
  • Voraussetzungen für erfolgreiche Optimierung sind
    Messbarkeit, Tests und Versionsverwaltung.
  • Optimierungsstrategien hängen oft von Architektur,
    Programmiersprache und Compiler ab.
  • Optimierungen haben häufig (ungewollt)
    Einfluss auf die Funktionalität.

Fragen zur Vertiefung und Wiederholung

Diese Fragen dienen der persönlichen Beschäftigung mit der Thematik, werden aber nicht separat in der Vorlesung besprochen.

  • Was ist die Grundvoraussetzung für Codeoptimierung? Warum ist sie entscheidend?
  • Welche weiteren Voraussetzungen sollten erfüllt sein, bevor man anfängt zu optimieren?
  • Warum ist es schwierig, allgemein gültige Strategien für die Codeoptimierung anzugeben?
  • In welchem Zusammenhang stehen „sauberer Code“ und Codeoptimierung? Warum ist es gerade im naturwissenschaftlichen Kontext so wichtig, Übung im Schreiben sauberen Codes unabhängig von der verwendeten Programmiersprache zu haben?
  • Warum ist Codeoptimierung in den meisten Fällen irrelevant?

Weiterführende Literatur

Eine kommentierte und handverlesene Liste mit weiterführender Literatur zum Thema. Die Auswahl ist zwangsläufig subjektiv.

Codeoptimierung ist insofern ein schwieriges Thema, als dass der Erfolg konkreter Strategien sehr von den jeweiligen Umständen abhängt. Deshalb ist es sinnvoll, sich auf das allgemeine Vorgehen zu konzentrieren. Eine recht ausführliche Beschreibung der allgemeinen Herangehensweise inklusive deutlicher Warnungen findet sich in Kapitel 25 in „Code Complete“ [McConnell, 2004McConnell, Steve (2004): Code Complete. A practical handbook of software construction, Microsoft Press, Redmond, Washington]. Das anschließende Kapitel 26 beschreibt dann eine ganze Reihe konkreter Optimierungstechniken inklusive der Vergleiche für jeweils mehrere Programmiersprachen.

Weitere Beispiele für allgemeine Beschreibungen des Problems und Vorgehens bei Codeoptimierung, jeweils mit Beispielen für konkrete Techniken, finden sich in Kapitel 12 in „The Art of UNIX Programming“ [Raymond, 2004Raymond, Eric S. (2004): The Art of UNIX Programming, Addison Wesley, Boston] und in Kapitel 7 in „The Practice of Programming“ [Kernighan, 1999Kernighan, Brian W.; Pike, Rob (1999): The Practice of Programming, Addison Wesley, Boston]. Eine gute Einführung in die O-Notation für die Komplexität von Algorithmen liefert Abschnitt 32, S. 177ff. in „The Pragmatic Programmer“ [Hunt, 1999Hunt, Andrew; Thomas, David (1999): The Pragmatic Programmer, Addison-Wesley, Boston].

Es gibt nur relativ wenige Studien, die versuchen, unterschiedliche Programmiersprachen direkt zu vergleichen. Eine davon stammt von Lutz Prechelt [Prechelt, 2000Prechelt, Lutz (2000): An empirical comparison of seven programming languages, Computer 33:23-29].

Kapitel 12 in „Effective Computation in Physics“ [Scopatz, 2015Scopatz, Anthony; Huff, Kathryn D. (2015): Effective Computation in Physics, O'Reilly, Sebastopol] befasst sich mit Parallelisierung als Spezialgebiet der Steigerung der Ausführungsgeschwindigkeit, die für manche Aspekte in den Naturwissenschaften durchaus von Belang sein kann, Abschnitt „Performancetests“ in Kapitel 16 in „Weniger schlecht programmieren“ [Passig, 2013Passig, Kathrin; Jander, Johannes (2013): Weniger schlecht programmieren, O'Reilly, Heidelberg] gibt eine kurze deutschsprachige Einführung in die Thematik.

Die originale Formulierung des Mooreschen Gesetzes von Gordon Moore stammt aus dem Jahr 1965 [Moore, 1965Moore, Gordon E. (1965): Cramming more components onto integrated circuits, Electronics (New York) 38:114-117]. Erstaunlich ist, dass diese Beobachtung über Jahrzehnte Bestand hatte.

Wer sich für die Anpassung von Simulationen an Daten interessiert, in deren Kontext Codeoptimierung häufig eine Rolle spielt, auch wenn die Wahl der konkreten Anpassungsstrategien oft viel wichtiger ist, dem seien die einführenden Werke von Luenberger und Ye [Luenberger, 2016Luenberger, David G.; Ye, Yunyu (2016): Linear and Nonlinear Programming, Springer, Cham] sowie Nocedal und Wright [Nocedal, 2006Nocedal, Jorge; Wright, Stephen J. (2006): Numerical Optimization, Springer, New York] empfohlen. Explizit auf die Entwicklung wissenschaftlicher Software gehen Oliveira und Stewart ein [Oliveira, 2006Oliveira, Suely; Stewart, David (2006): Writing Scientiic Software. A Guide to Good Style, Cambridge University Press, Cambridge].

Eine Übersicht über die Komplexität mathematischer Operationen findet sich in der englischsprachigen Wikipedia.

  • Hunt, Andrew; Thomas, David (1999): The Pragmatic Programmer, Addison-Wesley, Boston
  • Kernighan, Brian W.; Pike, Rob (1999): The Practice of Programming, Addison Wesley, Boston
  • Luenberger, David G.; Ye, Yunyu (2016): Linear and Nonlinear Programming, Springer, Cham
  • McConnell, Steve (2004): Code Complete. A practical handbook of software construction, Microsoft Press, Redmond, Washington
  • Moore, Gordon E. (1965): Cramming more components onto integrated circuits, Electronics (New York) 38:114-117
  • Nocedal, Jorge; Wright, Stephen J. (2006): Numerical Optimization, Springer, New York
  • Oliveira, Suely; Stewart, David (2006): Writing Scientiic Software. A Guide to Good Style, Cambridge University Press, Cambridge
  • Passig, Kathrin; Jander, Johannes (2013): Weniger schlecht programmieren, O'Reilly, Heidelberg
  • Prechelt, Lutz (2000): An empirical comparison of seven programming languages, Computer 33:23-29
  • Raymond, Eric S. (2004): The Art of UNIX Programming, Addison Wesley, Boston
  • Scopatz, Anthony; Huff, Kathryn D. (2015): Effective Computation in Physics, O'Reilly, Sebastopol
de/lehre/programmierkonzepte/ss2020/21/index.txt · Zuletzt geändert: 2020/09/30 21:35 von 127.0.0.1