Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie codiert man mehrfache Zuweisung in PHP 'richtig'?

Einklappen

Neue Werbung 2019

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

  • Wie codiert man mehrfache Zuweisung in PHP 'richtig'?

    PHP bietet die Möglichkeit, den Wert einer Expression mehrfach Variablen zuzuweisen. Die Zeitersparnis von mehr als 10% gegen über der zweiten Zuweisung in eigener Zeile hat mich dabei überrascht.(getestet auf https://wtools.io/php-sandbox/brWo mit PHP7.3.1). (Wobei in diesem Fall die Nutzung der aray_sum-Funktion noch besser/schneller ist.)

    diff two: 0.031863927841187
    diff double: 0.027723073959351
    diff sum: 0.025465965270996

    Gibt es eine Konvenstion wie man die Mehrfachzuweisungen grundsätzlich 'richtig' notiert?
    // So mit abgesetzten Zuweisungen und Expression
    PHP-Code:
    $sumVote +=
    $newResult[$voteAnswer['v']] =
        (!empty(
    trim($result[$voteAnswer['a']])) ?
            
    $result[$voteAnswer['v']] :
            
    0
        
    ); 
    // oder so mit Zuweisungsvariablen in einer Zeile
    PHP-Code:
    $sumVote += $newResult[$voteAnswer['v']] =
        (!empty(
    trim($result[$voteAnswer['a']])) ?
            
    $result[$voteAnswer['v']] :
            
    0
        
    ); 
    // oder in klassischer mit Zuweisung und Beginn der Expression
    PHP-Code:
    $sumVote += $newResult[$voteAnswer['v']] = (!empty(trim($result[$voteAnswer['a']])) ?
        
    $result[$voteAnswer['v']] :
        
    0
    ); 
    Die Mehrfachzuseisungen scheinen merklich Zeit einzusparen, so dass ich meinen Programmierstil darauf anpassen möchte. Meinen Benchmark habe als Text-Datei beigefügt.





    Angehängte Dateien

  • #2
    Ich denke das Fäll unter Mico-Optimierung und ist daher ziemlich egal welche Variante du verwendest.
    Ich bekomme bei mir auch bei jedem Aufruf andere Zahlen. Mal ist 1) am höchtsten, beim nächsten Aufruf ist 3) am höchsten usw.

    Code:
    diff two: 0.030772924423218
    diff double: 0.031435966491699
    diff sum: 0.027914047241211
    
    diff two: 0.030233926391602
    diff double: 0.027736902236938
    diff sum: 0.03053617477417
    
    diff two: 0.034692049026489
    diff double: 0.029463052749634
    diff sum: 0.029167890548706
    
    usw.
    In meinen Augen macht es hier mehr Sinn auf übersichtlichen Code zu achten, anstatt die Zeit in solchen Mico-Optimierungen zu verschwenden, wo man nach 2 Wochen den Code erstmal 3 mal lesen muss um zu verstehen was eigentlich passiert. Der PHP Interpreter optimiert den Code von alleine eh schon vor dem ausführen nochmal, um die optimale Geschwindigkeit rauszuholen.

    Kommentar


    • #3
      Die Zuweisung selbst erfoglt 10% schneller... ob das irgendwelche Auswirkungen auf den Vollständigen Lifecycle des Requests hat? Wohl kaum, die Laufzeit wird ja nicht durch Zuweisungen aufgebläht.

      Die Mehrfachzuseisungen scheinen merklich Zeit einzusparen, so dass ich meinen Programmierstil darauf anpassen möchte.
      Bitte bitte bitte nicht. Die gewonnene Zeit ist so minimal. Der Code ist danach so viel schwieriger zu lesen...
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Richtig.

        Und solche Aussagen
        Zitat von Padfina Beitrag anzeigen
        Die Zeitersparnis von mehr als 10% gegen über
        bringen gar nichts. Ist vergleichsweise so als wenn du auf der Strecke Hamburg-München mal auf 100 Meter 10% schneller fährst.
        Betrachte Zeiteinsparungen immer absolut oder in Bezug auf die Gesamtlaufzeit deines Prozesses.

        Kommentar


        • #5
          Zitat von Padfina Beitrag anzeigen
          PHP bietet die Möglichkeit, den Wert einer Expression mehrfach Variablen zuzuweisen. Die Zeitersparnis von mehr als 10% gegen über der zweiten Zuweisung in eigener Zeile hat mich dabei überrascht.
          Wer viel misst, misst mist. Die Geschwindigkeitsdifferenz kommt in der bench.txt nicht durch die Zuweisungen, sondern durch die Quelle der Daten.

          PHP-Code:
          $sumVote += $newResult[$voteAnswer['v']]; 
          Das sind zwei Zugriffe per Hash... die gibts nicht umsonst.


          Wenn du Zeit sparen willst, bring das in Ordnung:

          PHP-Code:
          (!empty(trim($result[$voteAnswer['a']])) ?
                  
          $result[$voteAnswer['v']] :
                  
          0
              
          ); 
          Ich hab keine Ahnung woher die Daten kommen und ob das trim und empty nötig sind... aber ein "$result[$voteAnswer['v']] ?? 0"; sollte beduetend schneller sein und besser lesbar.

          Kommentar


          • #6
            erc Danke für den Hinweis zu `??`. Ich werde versuchen ihn häufiger zu nutzen. Und danke für den Hinweis zur die Ursache der Zeitdifferenz.
            jspit, Dein Argument finde ich nicht zielführend. Nach meinen Erfahrungen ergeben sich merkliche Beschleunigungen oft durch viele kleine Optimierungen und durch Optimieren des eigenen Programmierstils.

            Zeichen32, VPh Das Argument der Lesbarkeit ist sicher relevant. Aber Lesbarkeit ist an Gewohnheiten gekoppelt. Aber Gewohnheiten kann man gegebenenfalls auch ändern.

            Was spricht gegen die Nutzung von Mehrfachzuweisungen?
            Oder ist die Gewohnheit nur Resultat einer ungeschriebenen Konvention beim Programmieren (=Paradigma, =Glaubenssatz), dass man pro Ausdruck nur eine Zuweisung machen darf.
            Was spricht dann für diesen Glaubenssatz.
            (Mein Bauchgefühl sagt mir, dass es schlecht ist, aber mein Verstand findet kein Beispiel, wann es verwirrend sein könnte. Vielleicht denkt mein Bauch zu linear? Können Mehrfachzuweisungen hilfreich sein, wenn ich im Code kennzeichnen will, dass ein Datum zu in skalierbare Prozesse ausgelagert werden kann, … oder wenn vielleicht bei asynchronem PHP (Link). Ich weiß ich spekuliere jetzt viel, aber die Frage sollte doch erlaubt sein, oder?)
            Mit der neuen Syntax
            PHP-Code:
               [$foo$bar] = fooBarGenerator($ups); 
            wird dieser Glaubenssatz ja auch aufgeweicht (! aber wegen des singulären Gleichheitszeichens noch nicht formal gebrochen).






            .

            Kommentar


            • #7
              Das Argument der Lesbarkeit ist sicher relevant. Aber Lesbarkeit ist an Gewohnheiten gekoppelt.
              Ich weiß nicht. Aus meiner Sicht muss man nicht darüber diskutieren, dass 2 simpelste Anweisungen immer einfacher zu lesen sind, als eine komplexe Anweisung die sich aus den zwei simplen Anweisungen zusammensetzt. Ich bin mir sicher, dass sich das auch mathematisch beweisen lässt

              $x = 12;
              $y = 17;

              $y = ($x = 12) + 5;

              ... ich weiß welche Version ich nutzen würde.


              Aber Gewohnheiten kann man gegebenenfalls auch ändern.
              Schon. Aber

              - Aus irgendeinem Grund hat sich der bestehende Weg im großen Stil etabliert. Du bist erst einmal in der Bringpflicht zu zeigen welchen Mehrwert der neue Weg bringt. Anschließend muss man abwägen ob der Mehrwert die Umstellung von Konventionen wert ist.
              - Solange du "für dich alleine" programmierst, kannst du Code schreiben wie du möchtest. Sobald die Chance besteht, dass irgendjemand anders zu dem Code etwas beitragen soll wird es für diese Personen schwierig sich da reinzufinden.
              - Kann sich das überhaupt etablieren? Mir fallen gerade nicht viele Szenarien ein, in denen sich so eine Mehrfachzuweisung überhaupt anbietet. Imo sind das schon spezielle Fälle, da lohnt es sich einfach nicht einen Extraweg zu gehen.
              [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
              [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

              Kommentar


              • #8
                , Dein Argument finde ich nicht zielführend. Nach meinen Erfahrungen ergeben sich merkliche Beschleunigungen oft durch viele kleine Optimierungen und durch Optimieren des eigenen Programmierstils.
                Eine optimierte Datenbankabfrage bringt dir wesentlich mehr. Und wenn sich die nächsten zehn Entwickler ob deines Codes die Haare raufen, stellt sich die Frage nach dem Vorteil noch einmal mehr.

                Nur, weil man für sich etwas neues entdeckt hat, bedeutet das nicht, dass man es entgegen aller guter Ratschläge umsetzen muss.

                Kommentar


                • #9
                  Zitat von Padfina Beitrag anzeigen
                  Was spricht gegen die Nutzung von Mehrfachzuweisungen?
                  Oder ist die Gewohnheit nur Resultat einer ungeschriebenen Konvention beim Programmieren (=Paradigma, =Glaubenssatz), dass man pro Ausdruck nur eine Zuweisung machen darf.
                  Was spricht dann für diesen Glaubenssatz.
                  Schau dir doch dein Code an:

                  PHP-Code:
                  $sumVote +=
                  $newResult[$voteAnswer['v']] =
                      (!empty(
                  trim($result[$voteAnswer['a']])) ?
                          
                  $result[$voteAnswer['v']] :
                          
                  0
                      
                  ); 
                  Das ist eine Anweisung die 7 Dinge macht. Die muss von der Mitte aus nach unten gelesen werden und wieder zurück. Das würde ich schonmal als sehr "gewöhnungsbedürftig" bezeichnen. Das ist kognetiver Aufwand für nix.

                  Ganz plump:

                  PHP-Code:
                  $value = !empty(trim($result[$voteAnswer['a']])) ? $result[$voteAnswer['v']] : 0;
                  $sumVote += $value;
                  $newResult[$voteAnswer['v']] = $value
                  Das lässt sich von oben nach unten lesen. Und die Variante wird genau so schnell sein wie die oben.

                  Kommentar


                  • #10
                    Lesbarkeit halt. Klar kannst du sagen, DassEsIrgendwannAlsLesbarEmpfundenWerdenWird, WennManAufLeerzeichenVerzichtet. Dem ist nicht sinnvoll zu widersprechen, denke ich. Ob es das jetzt in der aktuellen Welt zu einer guten Idee macht, ist eine andere Frage.

                    > Dein Argument finde ich nicht zielführend. Nach meinen Erfahrungen ergeben sich merkliche Beschleunigungen oft durch viele kleine Optimierungen und durch Optimieren des eigenen Programmierstils.

                    Die Aussage, dass das wahrscheinlich keinen auch nur ansatzweise spürbaren Effekt nach sich zieht, stimmt aber dennoch. Wenn du nicht von Hamburg nach München fährst, sondern von Hamburg bis 100 m hinter Hamburg, bringen dir 10 % Zeitgewinn unter sehr abstrakten Umständen vielleicht was, aber das Szenario ist natürlich total unrealistisch. Da kannst du auch anfangen, möglichst kurze Variablennamen zu verwenden, weil es das Parsen optimiert.

                    Edit:

                    Aber um die Frage vielleicht noch mal anders zu beantworten: Ein $x = $y = 0; würde ich persönlich jetzt nicht machen, aber im Zweifel schon noch akzeptieren. Einen Block wie deinen aus dem Eröffnungspost…

                    Code:
                    $sumVote +=
                    $newResult[$voteAnswer['v']] =
                        (!empty(trim($result[$voteAnswer['a']])) ?
                            $result[$voteAnswer['v']] :
                            0
                        );
                    …würde ich hingegen ziemlich sicher ablehnen. Und zwar ungeachtet der Mehrfachzuweisung. Der ist auch aus anderen Gründen nur sehr schwer verständlich. Meines Erachtens jedenfalls.

                    Oder noch mal anders geantwortet:

                    Du machst da gerade Mikrooptimierungen. Die bringen – kam ja hier im Thread inzwischen wohl auch schon durch – praktisch immer nichts. Sie führen nur zum Eindruck für Außenstehende, dass da jemand „etwas spezielle Dinge“ tut. Kann man machen, aber das schreckt Leute ab, behaupte ich mal.

                    Ansonsten sind Performance-Themen einfach kaum sinnvoll besprechbar. Weil du eben im Zweifel oft sagen kannst: „Ja, aber es ist letztlich schon schneller, wenn ich es so mache, und schneller ist besser.“ Und dann fängt man an, Metriken wie Lesbarkeit hinzuzunehmen, die kaum objektivierbar sind usw. Das bringt es losgelöst von einem Kontext einfach nicht.

                    Letztlich geht es da um Verhältnismäßigkeiten. Und die sind häufig Erfahrungswerte. Wenn du das so gut lesen kannst und nicht im Team arbeitest, spricht nichts dagegen, das so zu machen. Wenn du in einem Team arbeitest, wird sich jemand beschweren. Und dann hast du halt so Rechnungen wie: „Ich spare der Firma 17 Cent über 10 Jahre durch die Optimierung, aber die Diskussion dazu kostete schon 43,19 €.“ Aber auch die Sichtweise kann man natürlich nicht pauschalisieren und sie führt auch nicht immer zu guten Antworten.

                    Deshalb kann ich da letztlich auch nur sagen: Mach die Zuweisungen nicht in ein Statement. Ist besser.

                    Kommentar


                    • #11
                      Wenn du nicht von Hamburg nach München fährst, sondern von Hamburg bis 100 m hinter Hamburg, bringen dir 10 % Zeitgewinn unter sehr abstrakten Umständen vielleicht was
                      Als Analogie an dieser Stelle würde ich sogar eher sagen, mit dem ICE von Hamburg nach München zu fahren und auf den ersten 100 Metern 10% zu sparen...

                      Kommentar


                      • #12
                        Zitat von Zeichen32 Beitrag anzeigen
                        Ich denke das Fäll unter Mico-Optimierung und ist daher ziemlich egal welche Variante du verwendest.
                        ....
                        Der PHP Interpreter optimiert den Code von alleine eh schon vor dem ausführen nochmal, um die optimale Geschwindigkeit rauszuholen.
                        Ich war hier vermutlich auf dem Holzweg. Lesbarkeit ist wichtiger als die mauluelle Mikro-Optimierung, wie das Beispiel von @erc zeigt..
                        Neben der Lesbarkeit des Code wird ein zukünftiger PHP-Compiler "Standard-"Varianten vermutlich besser und vollständiger optimieren können als ich manuell.

                        @xm22 "Nur, weil man für sich etwas neues entdeckt hat, bedeutet das nicht, dass man es entgegen aller guter Ratschläge umsetzen muss."
                        Das ist richtig. Aber vor den Ratschläge kommt die Frage, die aus meiner Sicht hinreichend und gut beantwortet.

                        Danke für eure Antworten und Zeit.

                        Kommentar

                        Lädt...
                        X