Matt: Ternärer Operator oder Schleifen

Hallo,

meine Frage ist recht simpel.
Ist die Performance (u.A. Schnelligkeit) bei Ternären Operatoren gleich schnell oder gar schneller als bei "einfachen" Schleifen?

z.B.
einfache Schreibweise

  
if ($shown_pages < 3) {  
  $shown_pages = 3;  
 } elseif ($shown_pages % 2 == 0) {  
  $shown_pages++;  
 }  

oder
ternärer Operator

  
$shown_pages = ($shown_pages < 3) ? 3 : ($shown_pages % 2 == 0) ? $shown_pages++ : $shown_pages;  

Geht es hier nur um das Thema übersichtlich und logischer oder welchen Weg empfehlt ihr?

Danke

  1. Hi,

    $shown_pages = (bedingung) ? $shown_pages++ : $shown_pages;

    Sowas ist gar nicht zu empfehlen.
    Niemals eine Variable, auf die ein post-/pre-in-/de-crement angewendet wird, im selben Ausdruck nochmal verwenden.

    Du sagst hier, für den Fall, daß die Bedingung wahr ist:
    $shown_pages = $shown_pages++;

    In Worten:
    Gib mir den Wert von shown_pages, erhöhe ihn zu irgendeinem späteren Zeitpunkt, und weise den gegebenen Wert shown_pages zu.

    Kannst Du garantieren, daß zuerst die Zuweisung gemacht wird und erst dann hochgezählt wird?
    Oder wird erst hochgezählt, und dann der vorher geholte Wert zugewiesen?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Ist die Performance (u.A. Schnelligkeit) bei Ternären Operatoren gleich schnell oder gar schneller als bei "einfachen" Schleifen?

    http://www.google.de/search?q=Performance+ternäre+Operator ->
    http://www.php-performance.de/kontrollstrukturen-bedingungen-if-switch-ternaer.php

  3. echo $begrüßung;

    Ist die Performance (u.A. Schnelligkeit) bei Ternären Operatoren gleich schnell oder gar schneller als bei "einfachen" Schleifen?

    if ist keine Schleife. Abgesehen davon ist der Unterschied in der Ausführungszeit sicher messbar, aber praktisch vernachlässigbar, da er im Grundrauschen untergeht.

    if ($shown_pages < 3) {

    $shown_pages = 3;
    } elseif ($shown_pages % 2 == 0) {
      $shown_pages++;
    }

    
    >   
    > oder  
    >   
    > `$shown_pages = ($shown_pages < 3) ? 3 : ($shown_pages % 2 == 0) ? $shown_pages++ : $shown_pages;`{:.language-php}  
      
    Wichtiger als die Millisekunden Rechenzeit sind die Minuten Denkzeit, um das verschachtelte zweite Beispiel fehlerfrei zu entwirren.  
      
      
    echo "$verabschiedung $name";
    
    1. Hello,

      Wichtiger als die Millisekunden Rechenzeit sind die Minuten Denkzeit, um das verschachtelte zweite Beispiel fehlerfrei zu entwirren.

      Da habe ich noch so ein Ding, über dessen Sinn bzw abwicklung ich seit Tagen grübele:

      $indicator = pack('c', @eval('return '.$indicator.';'));

      Ein harzliches Glückauf

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  4. Hallo,

    Ist die Performance (u.A. Schnelligkeit) bei Ternären Operatoren gleich schnell oder gar schneller als bei "einfachen" Schleifen?

    was hat der ternäre Operator (auch Auswahloperator genannt) mit Schleifen zu tun? Das sind zwei völlig verschiedene Themen.

    einfache Schreibweise

    if ($shown_pages < 3) {

    $shown_pages = 3;
    } elseif ($shown_pages % 2 == 0) {
      $shown_pages++;
    }

      
    Da sehe ich keine Schleife.  
      
    
    > ternärer Operator  
    > `$shown_pages = ($shown_pages < 3) ? 3 : ($shown_pages % 2 == 0) ? $shown_pages++ : $shown_pages;`{:.language-php}  
      
    
    > Geht es hier nur um das Thema übersichtlich und logischer oder welchen Weg empfehlt ihr?  
      
    Sagen wir's mal so: Der wesentliche Unterschied ist, dass der Fragezeichen-Operator im Sinne der Syntax ein "Ausdruck" ist und als solcher einen Wert, ein Ergebnis zurückliefert. Das if-Statement tut das nicht; es führt abhängig von einer Bedingung einen Code-Block aus oder eben nicht (bzw. entweder den einen oder den anderen Block, wenn ein else verwendet wird). Die Ausführung dieses Codes liefert aber kein Ergebnis.  
      
    Genau davon sollte man meiner Ansicht nach die Entscheidung abhängig machen, ob man ein if-Statement oder den Fragezeichen-Operator nutzt.  
    Es gibt Fälle, wo beides möglich ist:  
      
      if (bedingung)  
       { $variable = funktion1();  
       }  
      else  
       { $variable = funktion2();  
       }  
      
    In solchen Fällen würde ich den ternären Operator vorziehen: Die Anweisung ist in beiden Entscheidungszweigen die gleiche, nur der berechnete Ausdruck ist unterschiedlich. Genau das drückt der ternäre Operator IMHO wesentlich klarer und übersichtlicher aus:  
      
      $variable = (bedingung ? funktion1() : funktion2());  
      
    Der Code, der dabei intern ausgeführt wird, dürfte aber sehr, sehr ähnlich sein; so ähnlich, dass ich nicht glaube, dass man von einem Performance-Unterschied reden könnte.  
      
    So long,  
     Martin  
    
    -- 
    Ist die Katze gesund,  
    freut sich der Hund.
    
  5. Hi,

    Ist die Performance (u.A. Schnelligkeit) bei Ternären Operatoren gleich schnell oder gar schneller als bei "einfachen" Schleifen?

    Das weiß ich nicht, aber was hindert dich daran es auszuprobieren?
    Ausserdem gibt es keine if-Schleifen, sondern if-Abfragen.

      
    
    >  } elseif ($shown_pages % 2 == 0) {
    
    

    Wenns dir um die Performance geht könntest du hier auch anders vorgehen um abzufragen, ob die Zahl gerade ist: Performance von Abfragen gerade/ungerade
    Ich denke mal, dass sich da von Javascript auf PHP nicht viel ändern wird.

    Geht es hier nur um das Thema übersichtlich und logischer oder welchen Weg empfehlt ihr?

    Ich persönlich finde es bei mehr als einem Fragezeichen ziemlich unübersichtlich, besonders wenn alles in einer Zeile steht.

    mfG,
    steckl

    1. Moin.

      Ausserdem gibt es keine if-Schleifen, sondern if-Abfragen.

      Siehe auch if-schleife.de ;)
      Wobei ich als dt. Übersetzung von 'if statement' if-Anweisung bevorzugen würde...

      Christoph

    2. @@steckl:

      Ausserdem gibt es keine if-Schleifen

      Bist du sicher?

      Live long and prosper,
      Gunnar

      --
      “New Jersey Hall of Fame? […] But then I ran through the list of names: Albert Einstein, Bruce Springsteen... my mother's going to like that. […] it's the only time she's going to hear those two names mentioned in the same sentence, so I'm going to enjoy it.” (Bruce Springsteen when inducted into the New Jersey Hall of Fame, 2008-05-04)