Max: Skripte optimieren

Hallo!

Hat jemand eine gute Netzseite, auf der beschrieben wird, wie man Perl-Skripte geschwindigkeitsoptimieren kann? Ich habs mit Google versucht, aber keine brauchbaren Ergebnisse erzielen können.

Bisher hab ich nur herausgefunden, dass es klüger ist, bei der zeichenweisen Verarbeitung eines Strings die Zeichen Stück für Stück mit substr auszulesen und zu verarbeiten, anstatt den String in ein Array zu konvertieren *lol*

Danke schonmal,

Max

  1. Hallo,

    Hat jemand eine gute Netzseite, auf der beschrieben wird, wie man Perl-Skripte geschwindigkeitsoptimieren kann? Ich habs mit Google versucht, aber keine brauchbaren Ergebnisse erzielen können.

    Ich kenne da zwar keine, aber prinzipiell gelten für Perl die gleichen Grundregeln, wie sie für andere Sprachen gelten. Da müßte sich doch was finden lassen. Auch in der Dokumentation von Perl sind an vielen Stellen Hinweise zu finden, die einem helfen, die Geschwindigkeit zu erhöhen.

    Hier meine (bruchstückhafte) Hitliste an üblichen Kanditaten, die man vermeiden sollte:

    1.) Das vollständige Einlesen einer Datei, obwohl man nur einen Teil davon wirklich zur verarbeitung benötigt. Das verursacht neben unnötigen Lesezugriffen auf die Datei auch erhöhten Speicherbedarf.
    Das gilt auch für andere externe Ressourcen wie z.B. Datenbanken.

    2.) Generell das verwalten von großen Datenmengen in Arrays und Hashes (oder komplexere Strukturen daraus). Perl hat imho eine ineffiziente Speicherverwaltung, wenn es um größere Datenstrukturen geht.

    3.) Oft ist es besser ein nur in bestimmten Fällen benötigtes Modul nicht mit use sondern mit require erst zur Laufzeit einzubinden, vor allem wenn es sich um Webscripts handelt, die nicht unter mod_perl laufen.

    4.) fehlende oder ungünstige Abbruchbedingungen bei Schleifen.

    5.) Schlecht strukturierter/formatierter Code. Neben der Laufzeit-Performance gibt es auch die (ich sag mal) Entwicklungs-Performance. Wirr zusammengestoppelter Code, dem jegliche Formatierung fehlt, und dessen Struktur die Aufgaben der einzelnen Code-Blöcke nicht wiederspiegeln, verhindern eine gute Lesbarkeit, was dazu führt, dass man sich beim Entwickeln schwerer tut. Und wenn man die Arbeitsweise eines Scripts nicht mehr wirklich erkennen kann, kann man auch potentielle Laufzeit-Performance-Schwächen schlechter erkennen.[1]

    Bisher hab ich nur herausgefunden, dass es klüger ist, bei der zeichenweisen Verarbeitung eines Strings die Zeichen Stück für Stück mit substr auszulesen und zu verarbeiten, anstatt den String in ein Array zu konvertieren *lol*

    Perl bietet für viele Aufgaben betreffend der Stringverarbeitung wesentlich elegantere Konzepte (die meist mit regulären Ausdrücken zu tun haben), so dass substr() eigentlich eine Aussenseiterrolle in dieser Sprache spielt. Meist verwenden Perl-Neulinge, die von einer anderen Sprache kommen, substr() mangels besserem Wissen um die Möglichkeiten von Perl.

    Grüße
      Klaus

    [1] Das gilt imho auch z.B. für das Formulieren von SQL-Statements. Ich habe u.a. hier im Forum schon eine Vielzahl an Statements gesehen, die in einer Wurst hingeschrieben sind, so dass deren Lesbarkeit (und Begreifbarkeit) gegen null geht.

    1. Hallo Klaus!

      Danke für deine Antwort, auch wenn mir die Punkte schon bekannt waren. Die Speicherverwaltung von Perl ist in der Tat _sehr_ ineffektiv und ich hoffe auf Version 6.0, mit der hoffentlich eine bessere Verwaltung Einzug hält.

      Naja, bei einem wichtigen Teil meines Programms geht es um das zeichenweise Lesen eines Strings - einer Art Stackautomaten - und da komm ich kaum um substr() drum rum. Vielleicht finde ich ja irgendwann noch eine praktikable Möglichkeit mit regulären Ausdrücken, da diese in der Tat in ordentlicher Geschwindigkeit verarbeitet werden, auch wenn sie nicht so gut lesbar sind. Vor allem wenn man an einem Code-Fetzen über Monate nicht mehr gearbeitet hat tut man sich dann verdammt schwer!

      Ciao,

      Max