Paul: Performance durch Initialisierung

Moin,
auf:
http://www.phpperformance.de/kleine-tipps-am-rande/#more-74
ist zu lesen, dass es Performance kostet wenn man Variablen die inkrementiert wird nicht vorher initialisiert.

Also sollte z.B.: for ($i=0; $i < count($parameterIDs); $i++) {...
langsamer sein als $i=0; for ($i=0; $i < count($parameterIDs); $i++) {...

Stimmt das?

  1. hi,

    auf:
    http://www.phpperformance.de/kleine-tipps-am-rande/#more-74
    ist zu lesen, dass es Performance kostet wenn man Variablen die inkrementiert wird nicht vorher initialisiert.

    Also sollte z.B.: for ($i=0; $i < count($parameterIDs); $i++) {...
    langsamer sein als $i=0; for ($i=0; $i < count($parameterIDs); $i++) {...

    Nein, das ist ein Missverständnis - hier _wird_ die Variable ja initialisiert, und zwar gleich zu Beginn der For-Schleife.

    Was eher sinnvoll wäre, ist die Anzahl der Parameter _vor_ der Schleife zu ermitteln, damit count() nicht bei jeder Überprüfung der Schleifenabbruchbedingung, als in jedem Durchlauf, wieder ausgeführt werden muss:

    $anzahlParameter = count($parameterIDs)
    for ($i=0; $i < $anzahlParameter; $i++) { ...

    Das kann man natürlich auch so schreiben:
    for ($i=0, $anzahlParameter = count($parameterIDs); $i < $anzahlParameter; $i++) { ...

    Die Semikolons trennen die "Parameter" einer For-Schleife in drei Blöcke:

    • "Anweisungen", die beim Eintreten in die Schleife ausgeführt werden sollen,
    • Abbruchbedingung, die vor jedem neue Durchlauf überprüft wird, und
    • "Anweisungen", die nach dem Ende jeden Durchlaufes ausgeführt werden sollen.

    "Anweisungen" in Anführungszeichen, weil dort natürlich nicht ausnahmlos alles erlaubt ist, sondern nur "Ausdrücke".

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. gudn tach!

      Was eher sinnvoll wäre, ist die Anzahl der Parameter _vor_ der Schleife zu ermitteln, damit count() nicht bei jeder Überprüfung der Schleifenabbruchbedingung, als in jedem Durchlauf, wieder ausgeführt werden muss:

      $anzahlParameter = count($parameterIDs)
      for ($i=0; $i < $anzahlParameter; $i++) { ...

      oder einfach rueckwaerts zaehlen. u.u. ist das noch mal schneller, weil man dann nur vergleiche mit einer _konstanten_ durchfuehrt.

      for($i=count($parameterIDs)-1; $i>=0; --$i){ ... }

      prost
      seth

      1. Hallo zusammen,

        $anzahlParameter = count($parameterIDs)
        for ($i=0; $i < $anzahlParameter; $i++) { ...

        oder einfach rueckwaerts zaehlen. u.u. ist das noch mal schneller, weil man dann nur vergleiche mit einer _konstanten_ durchfuehrt.

        for($i=count($parameterIDs)-1; $i>=0; --$i){ ... }

        Ich würde wegen der Übersichtlichkeit trotz möglichen Geschwindigkeitsvorteilen die erste Variante mit dem count-Aufruf in der Schleifenbedingung nehmen. Wenn man sich darüber Gedanken macht, ob count() ein paar mal zu oft aufgerufen wird, hat man mit PHP vielleicht auch die falsche Programmiersprache gewählt ;-)

        Schöne Grüße,

        Johannes

        1. gudn tach!

          for($i=count($parameterIDs)-1; $i>=0; --$i){ ... }

          Ich würde wegen der Übersichtlichkeit trotz möglichen Geschwindigkeitsvorteilen die erste Variante mit dem count-Aufruf in der Schleifenbedingung nehmen.

          darfst du auch, verbietet dir keiner.
          ist halt 'ne gewoehnungssache. ich zaehle halt gerne rueckwaerts und find's genauso uebersichtlich.
          in matlab z.b. kann einem sowas u.u. _sehr_ viel zeit und wegen impliziter initialisierung auch code ersparen.

          prost
          seth

          1. Tach.

            ist halt 'ne gewoehnungssache. ich zaehle halt gerne rueckwaerts und find's genauso uebersichtlich.

            Vernünftige™ Compiler optimieren solche Schleifen selber, so daß man sich da nicht groß verbiegen muß. Wie's bei den Interpretern aussieht, weiß ich nicht ...

            in matlab z.b. kann einem sowas u.u. _sehr_ viel zeit und wegen impliziter initialisierung auch code ersparen.

            Sieh an, noch ein verwandter Matlab-Geschädigter. ;)

            --
            Once is a mistake, twice is jazz.
            1. gudn tach!

              in matlab z.b. kann einem sowas u.u. _sehr_ viel zeit und wegen impliziter initialisierung auch code ersparen.

              Sieh an, noch ein verwandter Matlab-Geschädigter. ;)

              disp('matlab stinkt!')

              ;-)

              prost
              seth

              ps: aber dass sowas wie true=false; false=42; exit='brfffz!'; und clear='will nedd!'; geht, finde ich wenigstens lustig.