Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Was ist besser, Array by ref oder return copy

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Was ist besser, Array by ref oder return copy

    Hallo,

    den internen Code von PHP habe ich mir nicht angeschaut, deshalb die folgende Frage:
    Ist es performanter an eine Funktion ein Array per Referenz zu übergeben, um es füllen zu lassen, oder das Array in der Funktion zu erzeugen und via return zurück zu geben? Bei letzterem würde ein Kopie entstehen, ausser man gibt seinerseits eine Referenz zurück.
    PHP-Code:
    Fall1:
    $a = array(); // die doppelte Erzeugung, zur Vermeidung von Warnings o.ä.
    fuell_mich($a);
    function 
    fuell_mich(&$a){
        
    $a = array();
        
    // befuellung

    oder
    PHP-Code:
    Fall2:
    $a fuell_mich();
    function 
    fuell_mich(){
        
    $a = array();
        
    // befuellung
        
    return $a;

    Persl. vermute ich Fall 1 ist schneller. Aber was kostet die doppelte Array-Erzeugung und im zweiten Fall die return-Kopie?

    Was meint Ihr? Welchen Weg geht Ihr?
    Grüße & Danke
    Jörgy

  • #2
    Meinungen kann man viele haben

    https://www.youtube.com/watch?v=_YZIBWQr_yk

    schaue das video an,

    mache tests, benchmarks, google und dann frag ob es jemals soweit kommt dass du so viele array elemente bearbeiten wirst dass es wirklich ausschlaggebend seind wird
    apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

    Kommentar


    • #3
      Zitat von BlackScorp Beitrag anzeigen
      Meinungen kann man viele haben
      ... und was willst Du damit sagen?

      Zitat von BlackScorp Beitrag anzeigen
      Nettes Filmchen, das aber meine Frage nicht beantwortet. Auf Performance wird darin nirgends eingegangen. Danke trotzdem.

      Zitat von BlackScorp Beitrag anzeigen
      mache tests, benchmarks, google und dann frag ob es jemals soweit kommt dass du so viele array elemente bearbeiten wirst dass es wirklich ausschlaggebend seind wird
      Warum habe ich wohl die Frage gepostet?

      Thanx anyway
      joergy

      Kommentar


      • #4
        Ich weiß nicht, ob das wirklich einen großen Unterschied macht.
        Generell tendiere ich aber eher zu einer Variante mit return.
        Damit gibst du dem Anwender deiner Methode mehr Freiheiten und es führt nicht zu (von außen gesehen) unerwartetem Verhalten.
        Ich orientiere mich bei so etwas immer an der breiten Masse. Üblich ist es mit return values zu arbeiten.
        War der Beitrag hilfreich? Dann Bedank dich mit einem klick auf .

        Kommentar


        • #5
          Zitat von Dreamwatcher Beitrag anzeigen
          Generell tendiere ich aber eher zu einer Variante mit return.
          Damit gibst du dem Anwender deiner Methode mehr Freiheiten und es führt nicht zu (von außen gesehen) unerwartetem Verhalten.
          Kann man auch anders sehen, wenn man bspw. das Array ergänzen will...
          Zitat von Dreamwatcher Beitrag anzeigen
          Ich orientiere mich bei so etwas immer an der breiten Masse. Üblich ist es mit return values zu arbeiten.
          Hm, denkt die "breite Masse" über so etwas nach?

          Danke für Deine Antwort.
          Gruss
          Jörgy

          Kommentar


          • #6
            Die erste Variante ist natürlich performanter, aber ich kann mir nicht vostellen dass Du an einem Projekt arbeitest wo dieser Unterschied von so großer Bedeutung ist. Und wenn doch, solltest Du dir eher Gedanken darüber machen die Sprache zu wechseln.

            Kann man auch anders sehen, wenn man bspw. das Array ergänzen will...
            Poste mal einen Beispielcode oder beschreib einen Anwedungsfall in dem das Sinn machen würde.

            Kommentar


            • #7
              Zitat von joergy Beitrag anzeigen
              ... und was willst Du damit sagen?
              http://www.php.de/php-einsteiger/675...sumfragen.html
              Zitat von joergy Beitrag anzeigen
              Nettes Filmchen, das aber meine Frage nicht beantwortet. Auf Performance wird darin nirgends eingegangen. Danke trotzdem.
              da wird erklärt dass es performanter ist, da wird erklärt wie PHP mit variablen umgeht

              Zitat von joergy Beitrag anzeigen
              Warum habe ich wohl die Frage gepostet?
              weil kurz vom langen wochende und man irgendwie die letzten stunden überbrücken möchte? keine ahnung
              apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

              Kommentar


              • #8
                Hallöchen,

                Zitat von Okinez Beitrag anzeigen
                Die erste Variante ist natürlich performanter (..)
                Wie kommst du darauf? Wird das Array tatsächlich kopiert? Ich glaube nicht und tippe somit auf Variante zwei.

                Viele Grüße,
                lotti
                [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                Kommentar


                • #9
                  Zitat von lottikarotti Beitrag anzeigen
                  Wird das Array tatsächlich kopiert?
                  Von kopieren habe ich nichts erwähnt. Ich habe mich auf den Code vom TE bezogen und dachte die Frage bzgl Performance bezieht sich auf folgendes:
                  PHP-Code:
                  <?php
                  function fill(&$a$arg1$arg2) {
                      
                  $a['first'] = $arg1;
                      
                  $a['second'] = $arg2;
                  }
                  $values = array();
                  fill($values'Value1''Value2');
                  fill($values'Value1.1''Value2.1');
                  // ...


                  function get($arg1$arg2) {
                      
                  $arr = array(
                          
                  'first' => $arg1,
                          
                  'second' => $arg2
                      );
                      return 
                  $arr;
                  }
                  $values1 get('Value1''Value2');
                  $values2 get('Value1.1''Value2.1');
                  // ...

                  Kommentar


                  • #10
                    Hallöchen,

                    Zitat von Okinez Beitrag anzeigen
                    Von kopieren habe ich nichts erwähnt. Ich habe mich auf den Code vom TE bezogen und dachte die Frage bzgl Performance bezieht sich auf folgendes
                    Der Flaschenhals wird ja auch hier an der gleichen Stelle vermutet. Aber ist Variante 1 in deinem Beispiel tatsächlich schneller? Ich würde nicht darauf wetten, für ein Benchmark bin ich jetzt aber zu faul.

                    Viele Grüße,
                    lotti
                    [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                    Kommentar


                    • #11
                      Zitat von lottikarotti Beitrag anzeigen
                      Der Flaschenhals wird ja auch hier an der gleichen Stelle vermutet. Aber ist Variante 1 in deinem Beispiel tatsächlich schneller?
                      Funktion nr. 1 überschreibt bestehenden Speicherplatz, Funktion nr. 2 fordert bei jedem Aufruf neuen Speicherplatz an. Wieso sollte also die 2. Funktion schneller ausgeführt werden?

                      Kommentar


                      • #12
                        Hallöchen,

                        Zitat von Okinez Beitrag anzeigen
                        Funktion nr. 1 überschreibt bestehenden Speicherplatz, Funktion nr. 2 fordert bei jedem Aufruf neuen Speicherplatz an. Wieso sollte also die 2. Funktion schneller ausgeführt werden?
                        In deinem konkreten Beispiel finden bei der ersten Variante immer zwei Speicherzugriffe statt. Das spielt in realen Szenarien performance-technisch zwar keine bedeutende Rolle, dürfte in diesem Zweikampf allerdings dezent ins Gewicht fallen. Variante 2 bleibt weiterhin mein Favorit

                        Viele Grüße,
                        lotti
                        [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                        Kommentar


                        • #13
                          Zitat von joergy Beitrag anzeigen
                          Kann man auch anders sehen, wenn man bspw. das Array ergänzen will...
                          Darum geht es hier aber auch nicht, weil eindeutig in beiden Funktionen ein neues Array erstellt wird.
                          Zitat von joergy Beitrag anzeigen
                          Hm, denkt die "breite Masse" über so etwas nach?
                          Mit der breiten Masse meinte ich nicht die, die das ganze Hobbymäßig lernen bzw. Erfahrung < 2-3 Jahre
                          Vielmehr meinte ich damit einerseits die breite Masse der Funktionen, die in PHP integriert sind. Diese sind (fast) alle nach dem Prinzip, dass ein Wert als Parameter übergeben wird und ein Array zurückgegeben wird.
                          Weiter überlegen sich die, die an großen Projekten etc. arbeiten, ganz sicher nach welchem Schema die Methoden aufgebaut werden sollen.

                          War oben vielleicht etwas kurz zusammengefasst.
                          War der Beitrag hilfreich? Dann Bedank dich mit einem klick auf .

                          Kommentar


                          • #14
                            und im zweiten Fall die return-Kopie?
                            Return gibt keine Kopie des Arrays zurück.

                            Kommentar


                            • #15
                              Das Stichwort dazu ist copy-on-write.

                              PHP-Code:
                              <?php

                              function mem()
                              {
                                  static 
                              $pos 1;
                                  static 
                              $start null;

                                  if (
                              null === $start) {
                                      
                              $start microtime(true);
                                  }

                                  
                              printf('[%s] Time: %01.3f Peak memory: %s' "\n",
                                          
                              $posmicrotime(true) - $startmemory_get_peak_usage());
                                  
                              $pos++;
                              }

                              function 
                              create_big_array()
                              {
                                  
                              $a array_fill(01000 1000'foo');

                                  
                              mem(); // 2

                                  
                              return $a;
                              }

                              mem(); // 1

                              $b create_big_array();

                              mem(); // 3

                              // [1] Time: 0.000 Peak memory: 339272
                              // [2] Time: 0.282 Peak memory: 64526920
                              // [3] Time: 0.282 Peak memory: 64527228
                              Zwischen Messpunkt 2 und 3 wird nichts umkopiert oder so.

                              Die gleiche Technik nutzt PHP auch bei Übergabe von Werten an Funktionen. Dort wird erst dann der Inhalt kopiert, wenn sich innerhalb der Funktion am Wert etwas ändert. Deshalb ist es quasi immer unsinnig/falsch, da was mit Referenzen optimieren zu wollen.

                              (Edit: Auch wenn der Gedanke prinzipiell nicht schlecht ist. Muss man halt wissen, was PHP – bzw. die meisten Programmiersprachen – da von sich aus optimiert. Auf den ersten Blick mag das kompliziert wirken, aber eigentlich wird dadurch alles wesentlich einfacher, weil Referenzen wirklich nur dann genutzt werden müssen, wenn der Seiteneffekt gewollt ist, auch den Wert einer Variablen im aufrufenden Kontext zu verändern.)

                              Kommentar

                              Lädt...
                              X