Faris: PHP Funktion nicht doppelt ausführen...

Hallo,

ich überlege wie ich die Performance meines PHP scriptes erhöhen kann. Hierbei ist mir beim loggen der Scriptzeiten aufgefallen, das ich offenbar Funktionen zwei mal ausführe:

if (get_fuss($laenge,$breite) != false) {$result[] = get_fuss($laenge,$breite);}

gibt es hierfür eine bessere Lösung? Das würde meine Scritplaufzeiten sicher deutlich verbessern.

Danke

Faris

  1. Hello,

    ich überlege wie ich die Performance meines PHP scriptes erhöhen kann. Hierbei ist mir beim loggen der Scriptzeiten aufgefallen, das ich offenbar Funktionen zwei mal ausführe:

    if (get_fuss($laenge,$breite) != false) {$result[] = get_fuss($laenge,$breite);}

    gibt es hierfür eine bessere Lösung? Das würde meine Scritplaufzeiten sicher deutlich verbessern.

    Ja. Erst die Wertzuweisung auf eine Variable durchführen und dann die Variable auswerten.
    Deine Variante könnte in Multiuserumgebungen sogar noch eine gefährliche Falle enthalten. Wenn Deine Funktion get_fuss() nämlich auf geteilte Ressourcen zugreifen sollte, schaffst Du Dir ein Nebenläufigkeitsproblem.

    if (($fuss = get_fuss($laenge,$breite)) !== false)
    {
        $result[] = $fuss;
    }
    else
    {
        $result[] = DEFAULT;
    }

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de

    1. Moin allerseits,

      Deine Variante könnte in Multiuserumgebungen sogar noch eine gefährliche Falle enthalten. Wenn Deine Funktion get_fuss() nämlich auf geteilte Ressourcen zugreifen sollte, schaffst Du Dir ein Nebenläufigkeitsproblem.

      if (($fuss = get_fuss($laenge,$breite)) !== false)
      {
          $result[] = $fuss;
      }
      else
      {
          $result[] = DEFAULT;
      }

      What is a "Nebenläufigkeitsproblem" und was meinst du damit bzw. worin liegt es jetzt hier?

      Grüße, JN

      -- ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
      http://www.johny7.de
      1. Hi johny7!

        What is a "Nebenläufigkeitsproblem" und was meinst du damit bzw. worin liegt es jetzt hier?

        if(exists($beer)) {   drink($beer); }

           Benutzer 1                    Benutzer 2

        0: [Skriptaufruf]
        1: exists($beer) -> true         [Skriptaufruf]
        2:                               exists($beer) -> true
        3: drink($beer) // *schlürf*
        4:                               drink($beer) // kein *schlürf*, da Bier schon weg ;-(

        Problem verstanden? =)

        Falls dich das Thema interessiert:
        http://de.wikipedia.org/wiki/Threadsicherheit
        http://de.wikipedia.org/wiki/Semaphor_%28Informatik%29
        http://de.wikipedia.org/wiki/Mutex

        MfG H☼psel

        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)

        -- "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        1. Hello Hopsel,
          hi johny7,

          What is a "Nebenläufigkeitsproblem" und was meinst du damit bzw. worin liegt es jetzt hier?

          if(exists($beer)) {   drink($beer); }

             Benutzer 1                    Benutzer 2

          0: [Skriptaufruf]
          1: exists($beer) -> true         [Skriptaufruf]
          2:                               exists($beer) -> true
          3: drink($beer) // *schlürf*
          4:                               drink($beer) // kein *schlürf*, da Bier schon weg ;-(

          nett erklärt :-)

          Problem verstanden? =)

          Falls dich das Thema interessiert:
          http://de.wikipedia.org/wiki/Threadsicherheit
          http://de.wikipedia.org/wiki/Semaphor_%28Informatik%29
          http://de.wikipedia.org/wiki/Mutex

          Das Problem tritt in Multiuserumgebungen prinzipiell immer auf, wenn eine Funktion, die auf äußere Daten zugreift, zweimal aufgerufen wird und in der Zeitlücke zwischen den Aufrufen bei anderen Prozessen nicht verhindert, dass diese die Daten ändern können.

          Oder auch anders ausgedrückt:
          - wenn zwischen Abfrage und Aktion eine Zeitlücke besteht.
          - wenn eine Zuweisung von einem Funktionsaufruf abhängig gemacht wird
            und diese Zusweisung dann erst durch erneuten Funktionsaufruf durchgeführt wird

            Das wäre hier der Fall, wenn die Funktion auf gemeinsame Daten zugreift.

          Das nennt man dann auch TOCTOU-Problem
          http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
          (neuerdings mit zwei 'T' in der Mitte) *g*
          http://www.owasp.org/index.php/File_Access_Race_Condition:_TOCTOU

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de

  2. Hi

    if (get_fuss($laenge,$breite) != false) {$result[] = get_fuss($laenge,$breite);}

    Du könntest den Rückgabewert der Funktion einer Variable zuweisen und dann, wenn du später diesen Wert brauchst, auf die Variable zugreifen, statt die Funktion jedes Mal wieder auszuführen.

    mfg
    Rato

    -- Selfcode: ie:( fl:( br:< va:) ls:[ fo:| rl:( n4:~ ss:) de:] js:| mo:| zu:)
    §§§
    Meine Postings basieren lediglich auf mein Wissen und können theoretisch faktisch wirklich völliger Blödsinn sein.
    §§§
  3. Moin!

    if (get_fuss($laenge,$breite) != false) {$result[] = get_fuss($laenge,$breite);}

    gibt es hierfür eine bessere Lösung? Das würde meine Scritplaufzeiten sicher deutlich verbessern.

    Dann rechne es einmal aus, speichere den Wert zwischen und benutze diesen für den Vergleich:

    $varFuss = get_fuss($laenge,$breite); if (! false === $varFuss) { $result[] = $varFuss; }

    Ich vermute mal, dass get_fuss() keine übermäßig großen Datenmengen zurück liefert.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    --
    Des fastix kleines CMS