Norbert: CGI-Skripts beschleunigen - geht das ?

Hallo Ihr !

Ich bin PERL-Neuling und habe grade ein kleines Programm für eine interaktive Linksammlung geschrieben. Nun versuche ich, das Skript - wenn möglich - zu optimieren, da ich annehme, dass bei steigender Datenmenge die Antwortzeit sich immer mehr verlängern wird (aufgrund der immer länger werdenen Linkdatei, die ich immer ganz auslesen und jede Zeile splitten muss).
Nun meine Frage: Gibt es Abfragen, etc.  die schneller verarbeitet werden als andere?
Gibts sonst irgendwas anzumerken, was das System und die Datenübertragung zum Browser bremst? Jede Anregung ist gerne willkommen.

Vielen Dank im voraus,

Norbert

  1. Hallo Norbert

    Nun versuche ich, das Skript - wenn möglich - zu optimieren, da ich annehme, dass bei steigender Datenmenge die Antwortzeit sich immer mehr verlängern wird (aufgrund der immer länger werdenen Linkdatei, die ich immer ganz auslesen und jede Zeile splitten muss).

    Ueber welche Groessenordnung redest du denn?
    Wenn du bei Datenmengen zwischen Nullkommairgendwas und ein paar Megabyte rumkratzt, lass man gut sein, das kriegt er ohne jede Probleme gebacken...
    Um dir einen Eindruck zu verschaffen: die http://www.teamone.de/cgi-local/sfasuch.pl liest bei einem gestarteten Suchvorgang eine ASCII-Datei aus, die derzeit 31 MB gross ist. Da ist die Wartezeit zwar mittlerweile wahrnehmbar, aber immer noch akzeptabel.

    viele Gruesse
      Stefan Muenz

    1. Vielen Dank !

      Noch eine Frage - wovon ist die Antwortzeit abhängig, nachdem ich auf einen "CGI-Link" geklickt habe
      (zB <a href" ..cgi-prgm?param1=wert1&blabla">test</a>

      Nur von der Übertragenen Datenmenge - ich verwende in meinen Skripts immer die ganze Adresse ("http:...cgiprgm.cgi?...) - gibts dazu was zu sagen ?

      Danke sehr,

      Norbert

      1. Noch eine Frage - wovon ist die Antwortzeit abhängig, nachdem ich auf einen "CGI-Link" geklickt habe
        (zB <a href" ..cgi-prgm?param1=wert1&blabla">test</a>
        Nur von der Übertragenen Datenmenge - ich verwende in meinen Skripts immer die ganze Adresse ("http:...cgiprgm.cgi?...) - gibts dazu was zu sagen ?

        Von der Summe aller von Dir ausgelösten Vorgänge (Berechnung der Ausgabe, Übertragung der Ausgabe), wie bei jedem HTTP-Zugriff.

        Bei normalen HTML-Seiten ist die "Berechnung" halt meistens relativ trivial - aber der Anwender sieht oft nicht, daß auf dem Server irgendwas berechnet wird (content negotiation, SSI, ...).

    2. Ueber welche Groessenordnung redest du denn?
      Wenn du bei Datenmengen zwischen Nullkommairgendwas und ein paar Megabyte rumkratzt, lass man gut sein, das kriegt er ohne jede Probleme gebacken...

      Für die meisten Fälle ist diese Aussage ausreichend.

      Allgemein kommt es darauf an, was Du mit den Daten anfangen willst, d. h. in welcher Komplexitätsklasse Deine Operationen sind.
      Beispiele:

      • Daten linear verarbeiten -> O(n), d. h. bei doppelter Datenmenge wird die Verarbeitungsdauer doppelt so hoch sein.
      • Daten "trivial" sortieren (bubblesort) -> O(n^2), d. h. bei doppelter Datenmenge wird die Verarbeitungsdauer ungeheuer explodieren, nämlich quadratisch ansteigen. (Gute Sortierverfahren sortieren mit O(n*log(n)).

      Außerdem ist CPU-Zeit nicht das einzige "enge" Gut - es gibt ja auch noch Hauptspeicher. Und oft kann man die eine Ressource mit der anderen kompensieren, d. h. Berechnungen durch Anlegen zusätzlicher Datenstrukturen beschleunigen usw. (Datenbanken und deren Indexbäume)

  2. Moin,

    Ich bin PERL-Neuling und habe grade ein kleines Programm für eine interaktive Linksammlung geschrieben. Nun versuche ich, das Skript - wenn möglich - zu optimieren, da ich annehme, dass bei steigender Datenmenge die Antwortzeit sich immer mehr verlängern wird (aufgrund der immer länger werdenen Linkdatei, die ich immer ganz auslesen und jede Zeile splitten muss).
    Nun meine Frage: Gibt es Abfragen, etc.  die schneller verarbeitet werden als andere?
    Gibts sonst irgendwas anzumerken, was das System und die Datenübertragung zum Browser bremst? Jede Anregung ist gerne willkommen.

    Ich vermute mal zunächst, daß sich die Länge der Linksammlung vorerst nicht im Megabyte-Bereich bewegen wird. Es gibt allerdings ein paar Dinge, die man unabhängig davon immer ins Auge fassen kann.

    Weiter unten im Forum http://www.teamone.de/selfaktuell/self_forum/40907.html war z.B. gerade von einem perl-Compiler die Rede, auch wenn dieser noch im beta-Stadium zu sein scheint.

    Beim Aufruf des Perl-Interpreters vergeht immer schon eine gewisse Mindestzeit, um den Perl-Prozess zu starten usw. Bei einigen Webservern kann man dies umgehen, indem man ein für den jeweiligen Server speziell optimiertes Perl als Modul installiert, welches dann resident im Speicher gehalten wird. Für Apache ist dies mod_perl, für IIS unter Winxx gibt es etwas analoges als .dll (guck z.B. mal auf http://www.activestate.com/plex/).

    Dann solltest Du checken, ob Dein Skript die 'cgi.pm'-Library verwendet und im Falle eines Falles überlegen, ob das unbedingt Not tut. Die cgi.pm besteht nämlich aus ca. 190kB Quellcode, der auch erst einmal geparst sein will, bevor die erste Antwort-Zeile vom Skript zurückgeliefert wird. Wenn es z.B. nur darum geht, Formulardaten zu parsen, dann tut es auch der 10-Zeiler, der in selfhtml im cgi-Unterkapitel steht.

    Das war's erstmal, was mir an Anregungen spontan so einfällt...

    Bis dannundwann...

    Andreas

  3. Hallo Ihr !

    Ich bin PERL-Neuling und habe grade ein kleines Programm für eine interaktive Linksammlung geschrieben. Nun versuche ich, das Skript - wenn möglich - zu optimieren, da ich annehme, dass bei steigender Datenmenge die Antwortzeit sich immer mehr verlängern wird (aufgrund der immer länger werdenen Linkdatei, die ich immer ganz auslesen und jede Zeile splitten muss).
    Nun meine Frage: Gibt es Abfragen, etc.  die schneller verarbeitet werden als andere?
    Gibts sonst irgendwas anzumerken, was das System und die Datenübertragung zum Browser bremst? Jede Anregung ist gerne willkommen.

    Hm, also wie ich das verstehe, soll das Script vielleicht einmal am Tag nur aufgerufen werden, und muss dann mehere MB an Daten bearbeiten.

    Also, dafür solltest du das Ding vielleicht mit Fork und meheren Kindprozessen programmieren. Dann kann das Ding mehere Datensätze gleichzeigt machen, und kann so schneller sein.

    Versuche allen unnötigen Code wegzulassen, wie z. B. Zusatzmodule.

    Vielleicht bringt auch FastCGI etwas. Das ist ne CGI-Erweiterung, die eigendlich meistens dann verwendet wird, wenn Scripte oft aufgerufen werden. Da hat man ohne weiteres bis zu 1000% Leistungszuwachs.

    Mod_Perl könnte auch was bringen, da es CGIs vorkompiliert im Speicher hält. Du musst dann halt sauber programmieren.