Claudius L.: Optimierung von JavaScript und PHP vergleichbar?

Hallo!

Nach diesem Posting von Beat habe ich das dort verlinkte Video angesehen und einige interessante Dinge gelernt …
Das komplette Video bezieht sich ja auf JavaScript. Auch wenn mir klar ist, dass JavaScript und PHP im Prinzip gundverschiedene Sprachen sind, wollte ich mal ganz dämlich nachfragen, ob und in wie weit sich Dinge aus dem Video auf PHP übertragen lassen?
Auf einiges trifft dies natürlich mit Sicherheit zu; Dinge wie „weniger Rechenarbeit -> bessere Performance“ sind ja unabhängig von der Sprache. Speziell allerdings würde mich interessieren, ob Konzepte (und die daraus resultierenden Probleme) wie die Scope Chain auch in PHP existieren. Und wenn nicht, anhand welcher Stichworte ich mich über Gleichwertiges für PHP informieren kann.
Würde mich um ein paar Denkanstöße freuen!

Gruß,

Claudius

PS: Ist es sinnvoll, für solche Fragen einen eigenen Thread zu eröffnen oder hätte ich einfach eine Antwort auf Beats Posting schreiben sollen? Bin bei sowas immer sehr unsicher.

  1. Hi,

    [das Video hab ich mir jetzt nicht angesehen, deshalb nichts speziell in Bezug darauf.]

    Auch wenn mir klar ist, dass JavaScript und PHP im Prinzip gundverschiedene Sprachen sind, wollte ich mal ganz dämlich nachfragen, ob und in wie weit sich Dinge aus dem Video auf PHP übertragen lassen? Auf einiges trifft dies natürlich mit Sicherheit zu; Dinge wie „weniger Rechenarbeit -> bessere Performance“ sind ja unabhängig von der Sprache.

    Ja, einige grundsätzliche Überlegungen Hinsichtlich Performance gelten natürlich so gut wie immer unabhängig von der jeweiligen Sprache. (Dadurch, dass sie eben nicht sprach-spezifisch sind, würde ich die allerdings auch eher in eine Kategorie wie "Algorithmen" stecken.)

    Speziell allerdings würde mich interessieren, ob Konzepte (und die daraus resultierenden Probleme) wie die Scope Chain auch in PHP existieren.

    Nein. PHP möchte, dass du ganz genau sagst, auf Eigenschaften welchen Objektes du zugreifst - es gibt dort einfach keine "chain", in welcher man weiter nach oben gehen könnte, wenn man im aktuellen scope das Gesuchte nicht findet.

    Und wenn nicht, anhand welcher Stichworte ich mich über Gleichwertiges für PHP informieren kann.

    Gleichwertig zu was?

    PS: Ist es sinnvoll, für solche Fragen einen eigenen Thread zu eröffnen oder hätte ich einfach eine Antwort auf Beats Posting schreiben sollen? Bin bei sowas immer sehr unsicher.

    Einen eigenen Thread halte ich hier durchaus für gerechtfertigt. Klar hättest du auch im anderen Thread posten können, aber der drehte sich um JavaScript, und auch noch an Hand eines konkreten Problems. Selbst mit einer Änderung des Titels und des Themenbereichs auf PHP hätte die Frage dort vermutlich nicht (mehr) viel Aufmerksamkeit gefunden.

    Wenn hier allerdings nicht noch jemand kommt, der doch Vergleichbarkeiten findet - dann solltest du auch hier die Frage noch mal konkretisieren; exakter beschreiben, woran genau du nun hinsichtlich PHP und Performance (und ihrer möglichen Optimierung) interessiert bist.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hallo ChrisB und danke für deine Antwort!

      Speziell allerdings würde mich interessieren, ob Konzepte (und die daraus resultierenden Probleme) wie die Scope Chain auch in PHP existieren.

      Nein. PHP möchte, dass du ganz genau sagst, auf Eigenschaften welchen Objektes du zugreifst - es gibt dort einfach keine "chain", in welcher man weiter nach oben gehen könnte, wenn man im aktuellen scope das Gesuchte nicht findet.

      Ich glaube, da hast du mich missverstanden – oder ich mich falsch ausgedrückt. Laut dem Video ist es in JavaScript so, dass beim Ausführen einer Funktion die sogenannte Scope Chain zusammengesetzt wird. An deren Ende befinden sich globale Variablen, weiter vorne in der Kette befinden sich lokale Variablen/Objekte, welche in der Funktion definiert wurden.
      Dies hat zur Folge, dass der Zugriff auf lokale Variablen erheblich schneller ist als der Zugriff auf globale Variablen, weshalb im Video empfohlen wird, bereits wenn man mehr als zwei Mal auf eine globale Variable zugreifen muss, diese in einer lokalen Variablen zwischenzuspeichern, um so schneller auf die Daten zugreifen zu können.
      Und damit hätte ich auch eine ganz konkrete Frage: Gilt dies auch für PHP? Meist wird ja von Konstrukten wie $user = $_GET['user'] abgeraten, da dann die Herkunft der Daten nichtmehr offensichtlich ist. Doch sollte es etwas mit der JavaScript-Scope Chain vergleichbares in PHP auch geben, dann wäre der Zugriff auf $user ja schneller als der auf die superglobale $_GET.

      Und wenn nicht, anhand welcher Stichworte ich mich über Gleichwertiges für PHP informieren kann.

      Gleichwertig zu was?

      Etwas Gleichwertiges zur JavaScript-Scope Chain, falls nicht die JavaScript-Regeln gelten.

      Wenn hier allerdings nicht noch jemand kommt, der doch Vergleichbarkeiten findet - dann solltest du auch hier die Frage noch mal konkretisieren; exakter beschreiben, woran genau du nun hinsichtlich PHP und Performance (und ihrer möglichen Optimierung) interessiert bist.

      Nun, im Video wird beispielsweise gesagt, der Zugriff auf Eigenschaften von Objekten und Array-Elemente sei wesentlich langsamer als der normale Variablenzugriff. Oder es wird von der Verwendung von foreach abgeraten … nur eben alles bezogen auf JavaScript.
      Ein konkretes Optimierungsproblem habe ich nicht, dafür arbeite ich in zu kleinen Maßstäben. Aber Interesse an der Thematik allgemein habe ich eben dennoch – soll eben auch „sauber“ sein.

      Gruß,

      Claudius

  2. Hi!

    Das komplette Video bezieht sich ja auf JavaScript. Auch wenn mir klar ist, dass JavaScript und PHP im Prinzip gundverschiedene Sprachen sind, wollte ich mal ganz dämlich nachfragen, ob und in wie weit sich Dinge aus dem Video auf PHP übertragen lassen?

    Es ist nicht nur das Sprachen"problem" sondern auch die unterschiedlichen Einsatzarten. PHP läuft einmal und erzeugt ein Ergebnis, Javascript läuft mitunter die gesamte Zeit während die Seite angezeigt wird und beeinflusst das Empfinden des Anwenders deutlich länger als der Request-Prozess normalerweise dauert (dauern sollte).

    Speziell allerdings würde mich interessieren, ob Konzepte (und die daraus resultierenden Probleme) wie die Scope Chain auch in PHP existieren.

    Schau dir die Möglichkeiten des Variablenzugriffs in Bezug auf die Scopes unter PHP an. In Funktionen gibt es nur eine Variablentabelle (das ist geraten), in der die lokalen Variablen abgelegt werden. Zugriffe auf andere Scopes erfordern eine Bekanntmachung. Es werden schon mal nicht mehrere Scopes automatisch abgeklappert (mit Ausnahme der Superglobals). Was genau beim global $var passiert, weiß ich nicht, aber wenn es mehr als das Einbinden eines Verweises in die lokale Variablentabelle ist, tät mich das (zunächst) wundern (bis mir Gründe dafür bekannt werden).

    Und wenn nicht, anhand welcher Stichworte ich mich über Gleichwertiges für PHP informieren kann.

    Sei kreativ! Was willst du wissen? "PHP", keine Frage. "Variables", ohne Zweifel. "Scope", darüber reden wir ja gerade, aber das Stichwort ist eventuell kontraproduktiv, weil es auch stark bei der OOP Verwendung findet (private, public, ...). Und natürlich "Performance", einen anderen Grund, das interne Verhalten PHPs Anderen nahezubringen, sehe ich gerade nicht.

    Noch ein Wort zu Messungen:
    Bei Performancemessungen sollte man meiner Meinung nach immer skeptisch reagieren, wenn im Versuchsaufbau eine Schleife in hoher Iterationenanzahl durchlaufen wird, um überhaupt ein Messergebnis zu erhalten, das über dem Grundrauschen liegt. Man kann damit zwar zeigen, dass Vorgang A und Vorgang B Differenzen aufweisen oder auch nicht, doch praxisnah ist das nicht. Meist will man mit PHP eine Webseite erzeugen und keine aufwendigen wissenschaftlichen Rechnungen durchführen. Die Vorgänge kommen also meist nur in geringer Zahl vor. Ob eine (oder wenige) Operation(en) nur 10 oder 20 Millisekunden dauert, fällt nicht ins Gewicht, weil die Übertragung der Seite deutlich länger dauert oder der Flaschenhals ganz woanders sitzt (Datenbankzugriff beispielsweise). Für den Anwender zählt letztlich seine Gesamt-Wartezeit, und da wäre es realistischer, wenn man das PHP-Script so schreibt, wie es später tatsächlich verwendet werden soll und die Zeit zwischen Request-Anfang und Response-Ende misst (Apaches Tool "ab" kann unter anderem dafür verwendet werden). Dich als Systembetreuer interessiert am Ende, wieviele Anwender gleichzeitig du zufriedenstellen kannst. Also wäre in meinen Augen eine "Requests pro Zeit"-Zahl in erster Linie wesentlich sinnvoller als ein hochiterativer Teilvorgangsvergleich.

    Um die Flaschenhälse im Script selbst zu finden, sollte man sich eines Profilers bedienen. Der setzt die Ausführungszeiten der Teilvorgänge gegeneinander ins Verhältnis. Damit sieht man die wirklich wichtigen zu behandelnden Stellen und kann sich die Zeit für Mikrooptimierungen sparen, die letzlich nichts oder nicht viel bringen.

    Lo!