kölir: Verständnisfrage

Hallihallo,

nach einigen Dingen die ich gehört hab bin ich etwas verwirrt, und weiß jetzt nichtmehr was stimmt.

Also es lässt sich dadurch beantworten ob:
if (dies) {
  aufwendige_Aufgabe();
  }
function aufwenige_Aufgabe()
{
aufwendige_Aufgaben;
aufwendige_Aufgaben;
aufwendige_Aufgaben;
aufwendige_Aufgaben;
aufwendige_Aufgaben;
}

schneller ist oder dies:
if (dies) {
  aufwendige_Aufgaben;
  aufwendige_Aufgaben;
  aufwendige_Aufgaben;
  aufwendige_Aufgaben;
  aufwendige_Aufgaben;
  }

Dazu meine Frage: Was ist schneller?
Hab so sachen gehört, dass Funktionen nicht compiled werden oder so ähnlich. Oder das Funktionen langsamer wären, wie wenn man die direkt in die schleife einbaut.

Wie geht der Compiler vor?

Bin verwirrt.

grüßchen

P.S.: Was wäre, wenn es keine aufwendige_Aufgaben wären sondern nur Kleinigkeiten, ändert sich dann die Antwort?

  1. Hallo Kölir,

    php wird (zumindest momentan) interpretiert und nicht kompiliert.

    Die Version mit dem zusätzlichen Funktionsaufruf dürfte ein paar Mikrosekunden langsamer sein, also fällt dieser zusätzliche Funktionsaufruf normalerweise nicht weiter ins Gewicht.

    Wichtiger finde ich, Code zu schreiben, der modular, übersichtlich und gut zu verstehen ist. Minimale Performanceeinbußen nehme ich dafür in Kauf.

    Gruß
    Olaf

    1. Hallo,

      stimme auch zu, besser der Code ist für Dich verständlich und du weisst was passiert als dass du große Funktionen schreibst die du dann nicht mehr verstehst.

      wenn du aber die Perfomance deines Skriptes messen willst:

      http://www.drweb.de/php/php_schneller_gemacht.shtml

      Viele Güße

      http://www.rechtsrat-jetzt.de/

      Hallo Kölir,

      php wird (zumindest momentan) interpretiert und nicht kompiliert.

      Die Version mit dem zusätzlichen Funktionsaufruf dürfte ein paar Mikrosekunden langsamer sein, also fällt dieser zusätzliche Funktionsaufruf normalerweise nicht weiter ins Gewicht.

      Wichtiger finde ich, Code zu schreiben, der modular, übersichtlich und gut zu verstehen ist. Minimale Performanceeinbußen nehme ich dafür in Kauf.

      Gruß
      Olaf

  2. Moin!

    Dazu meine Frage: Was ist schneller?

    Das Gesetz der Logik gebietet, dass der Funktionsaufruf natürlich mehr Zeit kostet, als die direkte Ausführung.

    Allerdings dürfte der Unterschied im Mikrosekundenbereich liegen, so dass an erster Stelle viel eher die Verständlichkeit des Codes stehen sollte. Weiterhin würdest du selbstverständlich beim Parsing des Skriptes wieder mehr Zeit verlieren, wenn deine aufwendige Zusammenfassungsfunktion an mehr als einer Stelle aufgerufen werden könnte, und du stattdessen Code mehrfach kopieren mußt.

    Hab so sachen gehört, dass Funktionen nicht compiled werden oder so ähnlich.

    PHP übersetzt den Quelltext in einen Syntaxbaum, der dann abgearbeitet wird. Das kann man mit viel gutem Willen als Compilieren bezeichnen, und es bietet für Zusatzmodule auch den Ansatzpunkt, diesen Syntaxbaum in einem Cache zu speichern, um bei späteren Skriptaufrufen das Parsing einzusparen.

    Tatsache ist, dass sämtlicher Quelltext in diesen Syntaxbaum übersetzt wird, auch Funktionen.

    Oder das Funktionen langsamer wären, wie wenn man die direkt in die schleife einbaut.

    Korrekt. Der Funktionsaufruf erfordert mehr Ausführungszeit, als ein direkter Befehl, weil für die Funktion ein lokaler Variablenraum geschaffen wird, die Rücksprungadresse und Register auf den Stack gespeichert und bei der Rückkehr wiederhergestellt werden müssen, etc.

    Und in der Tat wäre die Eliminierung von Funktionsaufrufen in Schleifen ein Ansatzpunkt, um die Ausführungszeit eines Skriptes positiv zu beeinflussen. Andererseits sollte man solche Optimierungen auch immer unter einem Kosten-Nutzen-Faktor sehen: Die Optimierung des Quelltextes kostet viel Zeit, und bringt verhältnismäßig wenig Gewinn (sofern nicht extreme Bremsen eingebaut wurden). Der Einsatz eines PHP-Caches (http://www.golem.de/0511/41800.html listet einige Namen) bringt ein Performanceplus sofort ohne Arbeitszeit. Die Investition in leistungsfähigere Hardware steht ebenso zur Disposition. Und zu guter Letzt: compilierte Sprachen sind gegenüber PHP erheblich schneller - wenn also Performance ein absehbares Problem ist, bietet es sich nicht an, in PHP zu beginnen, sondern gleich C, C++, Java/JSP oder ähnliches zu verwenden.

    Alle diese alternativen Möglichkeiten sind abzuwägen gegen den Zeit- und damit Geldaufwand einer manuellen Quellcode-Optimierung. Und gegen die möglichen Auswirkungen solch einer nervigen Arbeit auf die Stimmung der Programmierer.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."