Seite 1 von 2

Performance Fresser

Verfasst: 17.08.2006 22:42
von witzigerkiller
Hallo, ich wollte mal fragen(hab gegoogelt aber nix gefunden) welche php funktionen man vermeiden soll, und was alles performance weggnimmt..

Also ich hab mir sagen lassen das reguläre ausdrücke im zusammenhang mit preg_replace() stark performance fressen... ist das richtig`?

Und, wie siehts mit mysql aus, man soll ja immer diese `und` in sql befehlen geben, wenn man die weggläst schluckt das auch performance?

Meine datei, includet 5 dateien führt 4 sql query´s aus, und hat eine länge von: 103 zeilen.. da kommen noch 3 while und 1 for schleife for sowie 20 zeilen regex..

Die generationsdauer ist immer zwischen 0.07 und 0.10

bei mir ladet das zwar schnell aber auch hier hab ich mir sagen lassen das ich unter 0.05 kommen sollte..

Leider habe ich keine Seite gefunden wo erklärt wird, was in php performance fressen kann..

Kann mir da jemand einige Tipps und Tricks geben/zeigen, oder hat vllt. eine Seite im Internet?

Danke

Re: Performance Fresser

Verfasst: 17.08.2006 23:35
von Banger
witzigerkiller hat geschrieben:Hallo, ich wollte mal fragen(hab gegoogelt aber nix gefunden) welche php funktionen man vermeiden soll, und was alles performance weggnimmt..
Eins vorweg: generelle Aussagen lassen sich zu diesem Thema nicht treffen, sondern nur an Stellen, wo man zwei oder mehr Algorithmen/Funktionen für das gewünschte Ergebnis zur Verfügung hat, zwischen denen man wählen kann.
witzigerkiller hat geschrieben:Also ich hab mir sagen lassen das reguläre ausdrücke im zusammenhang mit preg_replace() stark performance fressen... ist das richtig`?
RegExps sind nicht trivial, das stimmt soweit und rührt schon allein von der Tatsache her, dass das Suchmuster geparsed werden muss. Das Dogma lautet hier: vermeide reguläre Ausdrücke, wenn Du sie nicht wirklich brauchst, d.h.: wenn Du nur feste Zeichenketten ersetzen willst (z.B. '<b>' durch '<strong>', verwende statt dessen das ungleich schnellere str_replace().
witzigerkiller hat geschrieben:Und, wie siehts mit mysql aus, man soll ja immer diese `und` in sql befehlen geben, wenn man die weggläst schluckt das auch performance?
Nein. Mit den Backticks maskierst Du Datenbank-, Tabellen- und Feldnamen. Das wird spätestens dann unabdingbar, wenn Du reservierte Wörter als Namen verwendest (z.B. day, month oder date).

Ein Schlusswort noch: Deine Rechtschreibung, Satzbau und Zeichensetzung sind für den Leser wahre Performancefresser. ;-)

Verfasst: 17.08.2006 23:49
von fanrpg
Um einfach begriffe zu suchen eignet sich am besten strpos, dannach preg_match, ereg soll am meisten fressen.

Zum ersetzen eignet sich str_replace() am besten (für einfache Begriffe, ab PHP5 auch stri_replace()) sonst natürlich ereg_replace oder preg_replace.

Ansonsten kannst du mal php.net studieren.
Bei MySQL ist mysql_unbuffered_query als mysql_query.
Und vermeide MySQL Abfragen in Schleifen. Dadurch produziert nur unnötig viele Querys.

Verfasst: 18.08.2006 00:17
von witzigerkiller
alles klar, danke

Verfasst: 18.08.2006 15:54
von BB-BF-BM
vielleicht kannst du auch hier und vor allem hier mal reinschauen

Verfasst: 18.08.2006 16:01
von witzigerkiller
hey cool, danke...

jetzt weiß ich das ich immer in mysql nur die benötigten felder und nicht immer
SELECT *
nehmen sollte und das in switch schleifen, das was am häufigsten verwendet wird ganz oben ist... bei mir ist es das default..

DAnke habs zwar teils nur überflogen hab aber viel rausbekommen.

Verfasst: 18.08.2006 16:23
von Banger
witzigerkiller hat geschrieben:nehmen sollte und das in switch schleifen, das was am häufigsten verwendet wird ganz oben ist... bei mir ist es das default..
switch und if sind Konstrukte, keine Schleifen! Schreib das 100x auf, damit Du es nicht vergisst ;-)

Außerdem halte ich diese Angabe für ausgemachten Mumpitz, denn um in den default-fall zu verzweigen, müssen die anderen Fälle auch erst geprüft werden.

Verfasst: 18.08.2006 16:25
von witzigerkiller
5. Umfangreiche Switch-Statements sollten nach Häufigkeit geordnete Case-Elemente besitzen. Die Laufzeit wird verkürzt, wenn die am häufigst wahrscheinlichen Elemente oben stehen. Sie werden halt schneller gefunden. Zudem sollte die Default-Angabe ganz oben stehen, wenn davon ausgegangen werden kann, dass die Default-Angabe am häufigsten zutrifft.

Beispiel:
steht in dem von dir geschriebenen 2ten link..

Verfasst: 18.08.2006 16:28
von Banger
witzigerkiller hat geschrieben:
5. Umfangreiche Switch-Statements sollten nach Häufigkeit geordnete Case-Elemente besitzen. Die Laufzeit wird verkürzt, wenn die am häufigst wahrscheinlichen Elemente oben stehen. Sie werden halt schneller gefunden. Zudem sollte die Default-Angabe ganz oben stehen, wenn davon ausgegangen werden kann, dass die Default-Angabe am häufigsten zutrifft.

Beispiel:
steht in dem von dir geschriebenen 2ten link..
Ja und? Es stimmt dennoch nicht. Denk einfach mal kurz, aber intensiv darüber nach, welche Bedingung vorhanden sein muss, damit in den default-fall verzweigt wird... na, klingelt's? ;-)

BTW: ich hab den Link nicht gepostet.

EDIT: schau mal in die Kommentare zu dem Artikel - der Autor hat's selbst begriffen :)

Verfasst: 18.08.2006 19:09
von Jensemann
Banger hat geschrieben: switch und if sind Konstrukte, keine Schleifen! Schreib das 100x auf, damit Du es nicht vergisst ;-)
Bringt leider wenig in Zeiten in denen selbst Informatik-Lehrer von if Schleifen sprechen.

Aber was zum Thema preg_*:

In Python kann man Reguläre Ausdrücke erst kompilieren, so dass das parsen bei wiederholter Verwendung nur einmal anfällt, in PHP scheint das nicht möglich. Jemand Ahnung ob PHP wiederholte RegExp selbst cached?