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,laenge,breite) != false) {result[]=get_fuss(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,laenge,breite) != false) {result[]=get_fuss(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(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(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: phpexists($beer) -> phptrue         [Skriptaufruf]
        2:                               phpexists($beer) -> phptrue
        3: phpdrink($beer) // *schlürf*
        4:                               phpdrink($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_(Informatik)
        http://de.wikipedia.org/wiki/Mutex

        MfG H☼psel

        --
        "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
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        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: `phpexists($beer)` -> `phptrue`         [Skriptaufruf]  
          > 2:                               `phpexists($beer)` -> `phptrue`  
          > 3: `phpdrink($beer) // *schlürf*`  
          > 4:                               `phpdrink($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  
          ![](http://selfhtml.bitworks.de/Virencheck.gif)  
            
          
          -- 
           ☻\_  
          /▌  
          / \ Nur selber lernen macht schlau  
          <http://bergpost.annerschbarrich.de>
          
  2. Hi

    if (get_fuss(laenge,laenge,breite) != false) {result[]=get_fuss(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,laenge,breite) != false) {result[]=get_fuss(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