molily: Performance nach Lesbarkeitsoptimierung

Beitrag lesen

Hallo,

frage ich mich allerdings wie man dort noch die Flaschenhälse identifizieren will - ich hatte bereits jetzt "Probleme". Nutzt man spezielle Tools, oder ist es "händische" Arbeit?

Ich bin kein PHP-Entwickler, aber ja, es gibt Tools, die deine Anwendung zur Laufzeit analysieren und dir genau aufschlüsseln, wo die Zeit verbraten wurde. Die heißen üblicherweise Profiler oder generell Performance-Analyzer.

PHP ist an sich sehr schnell. Für PHP speziell gibt es Optimierungsverfahren wie z.B. Opcode-Caches:
http://en.wikipedia.org/wiki/List_of_PHP_accelerators
http://php.net/manual/en/book.apc.php
und entsprechende Application-Server, z.B. den von Zend.

Und steht man am Ende nicht wieder irgendwann vor der Frage, ob man die Code-Struktur optimieren sollte, selbst wenn man an der eigentlich Programm-Logik nichts mehr zu verbessern weiß?

Saubere Code-Struktur (z.B. klassenbasierte OOP, Class-Autoloading, MVC-Frameworks…) erzeugt natürlich einen Overhead gegenüber Low-Level-Programmierung, ermöglicht dem Compiler aber auch Optimierungen. Die üblichen Methoden zur Code-Strukturierung, die auf Abstrahierung/Übersichtlichkeit, Lesbarkeit, Entkoppelung und Testbarkeit ausgerichtet sind, erzeugen keinen nennenswerten Overhead (mehr).

Wenn doch, dann ist PHP wahrscheinlich nicht die Sprache der Wahl, sondern es muss eine statisch typisierte Sprache wie Hack, Java oder Go her. Am besten eine, die Concurrency schon eingebaut hat.

Was üblicherweise bei Software Bottlenecks erzeugt ist, ist nicht die Code-Struktur allgemein, sondern die besagten Algorithmen sowie:

  • Input/Output
     - Lesen von der / Schreiben auf die Festplatte
     - Datenbankabfragen
     - Netzwerkverkehr
     - Objekte (de)serialisieren (Parsing, Marshalling)
  • Synchrone Aufgaben (erst muss A erledigt werden, dann kann B erledigt werden, wobei A lange dauert oder fehlschlagen kann)
  • Fehlende Parallelisierung (1000 Datensätze müssen verarbeitet werden, was parallel auf mehreren Kernen/Rechnern passieren könnte)

Das lässt sich generell lösen durch:

  • Abhängigkeiten vermeiden
  • Wiederholungen vermindern
  • Optimierung der I/O: Caching, Vermeidung redundanter Anfragen, Nutzung optimierter Datenbanken
  • Asynchrone und verteilte Berechnungen (Map Reduce)

Siehe bspw. http://highscalability.com/blog/2012/5/16/big-list-of-20-common-bottlenecks.html

Grüße
Mathias