Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Performance-Fragen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Performance-Fragen

    Ich kenne aus C die Fälle, dass man z.B. Variablen immer vor den Schleifen erstellt, um nicht in jedem Schleifendurchlauf erneut die selbe Variable zu erstellen. Ich frage mich nun, in wie fern dies bei PHP eine Rolle spielt.

    PHP-Code:
    while($someVar 0) {
        
    $someStr 'Number: ' $someVar;

        
    // Weitere Arbeitsschritte mit $someVar ...

        
    $someVar--;

    Wäre es eventuell performancetechnisch gesehen eleganter, die Schleife so zu schreiben:

    PHP-Code:
    $someStr '';
    while(
    $someVar 0) {
        
    $someStr 'Number: ' $someVar;

        
    // Weitere Arbeitsschritte mit $someVar ...

        
    $someVar--;

    Auch frage ich mich, was die bessere Methode ist im Web-Bereich: Einen langen und großen Query in einer Schleife zusammenbauen und zuletzt abschicken, um SQL weniger in Anspruch zu nehmen oder direkt in der Schleife einen Query nach dem anderen absenden?

  • #2
    Also zuerst vllt. mal der Hinweis, dass du wenn du nicht groben Unfug machst das Thema Performance in weiten Teilen bei PHP erst mal weglassen kannst.

    Welche der beiden Varianten mit der Variablen schneller/Langsamer ist kannst du am Besten selber raus finden, indem du dir von PHP die Zeit messen lässt.


    Was ich aber sicher sagen kann ist, dass SQL-Abfragen innerhalb von Schleifen nichts verloren haben, das gilt sowohl für den Aufbau (Also das zwischenspeichern für später), als auch für die Ausführung.

    Wenn du deine DB sinnvoll aufgebaut hast, reicht im allgemeinen eine Abfrage für das gewünschte Ergebnis.
    [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
    [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

    Kommentar


    • #3
      Semi-educated guess: Es dürfte nichts bringen, vor der Schleife zu deklarieren, weil die Schleife keinen eigenen Geltungsbereich eröffnet.

      Also, $someStr steht nach dem ersten Schleifendurchlauf in der Symboltabelle und wird daraus für die Methode/Funktion/… auch nicht mehr entfernt, wenn nicht ein explizites unset erfolgt.

      Kommentar


      • #4
        Macht alles Sinn, was ihr sagt. Bei C entsteht i.d.R. ein extra Geltungsbereich, bei PHP nicht. Und mehrere Queries gleichen Typs braucht man i.d.R. auch nie. Danke.

        Kommentar


        • #5
          Die Aussage, dass es in C so ist, kann ich übrigens nicht bestätigen. Denn, wenn man dem Compiler nicht explizit sagt, dass er nicht optimieren soll, wird er das tun, was er für besser hält. Wenn du in gcc die Optionen -S und -c benutzt, kannst du dir den produzierten Assembler-Code anschauen und du wirst sehen, dass mit der Option -O3 (maximale Optimierung) meistens bei solchen minderen Codeänderungen, wie der Deklarationsort einer Variable, genau der gleiche Aussembler-Code erzeugt wird. Bei -O0 (keine Optimierung), wird eine solche Änderung allerdings effektiv wahrscheinlich einen weiteren Register (macht den Code nicht langsamer) benutzen oder einen Register auf den Stack pushen (was den Code um ein Haar langsamer macht - und selbst da könnte der Prozessor noch mikrooptimieren).

          Was allerdings PHP angeht, ist Code 2 "langsamer", da du unnötig eine leere Zeichenkette erstellst und an eine Variable bindest. Diese leere Zeichenkette ist also 1 Byte lang, wird nie benutzt, muss malloc()ed und auch noch gefree()d werden, bzw. realloc()ed werden.

          Querys in Schleifen ausführen, wenn man einen einzigen Query dafür benutzen könnte, ist eigentlich immer 'ne schlechte Idee.
          Crashkurs zum Thema Rechtschreibung: [COLOR="Green"]normalerweise[/COLOR] ([COLOR="Red"]normaler weise[/COLOR] oder [COLOR="Red"]normaler weiße[/COLOR]), [COLOR="DarkGreen"]Standard[/COLOR] ([COLOR="Red"]Standart[/COLOR]), [COLOR="DarkGreen"]eben[/COLOR] ([COLOR="Red"]ebend[/COLOR])

          Kommentar


          • #6
            Die Ausführungen zeigen mal wieder, wie weitläufig Performance-Themen häufig sind und auf wie vielen (auch verwobenen) Ebenen sie betrachtet werden können. Deshalb existieren Begriffe wie Premature Optimization.

            Es gibt da ja so Witze mit „Na darauf wäre der Compiler nie von selbst gekommen“. Etwa bei x = y << 2 statt x = y * 4.

            Der PHP-Compiler optimiert das tatsächlich nicht:

            http://3v4l.org/kn64E/vld#tabs
            http://3v4l.org/2JEDM/vld#tabs

            Kommentar

            Lädt...
            X