Einzelnen Beitrag anzeigen
  #15 (permalink)  
Alt 08-01-2015, 06:06
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 452
mermshaus wird schon bald berühmt werden
Standard

foreach kopierte im Jahr 2011 ungefähr unter diesen Umständen:

- PHP internals: When does foreach copy?

Ob das „heutzutage“ (geht ja eher um die PHP-Version) noch immer so ist – keinen blassen Schimmer. Unter anderem so was meinte ich mit undankbaren Diskussionen über Laufzeiteigenschaften. Es kann immer gut sein, dass da intern von einer Version auf die nächste was „optimiert“ wird.

In meiner Variante wird das Array jedenfalls nicht kopiert (getestet mit memory_get_peak_usage()).

Die Geschichte mit dem $found bei mir existiert aber auch deshalb, weil PHP mehr Speicher verbraucht hat, als das unset() direkt innerhalb der foreach-Schleife stand. – Zumindest dann, als der Code wiederum nicht innerhalb einer Funktion stand, der $fahrten per Referenz übergeben wird.

Das hier…

PHP-Code:
function merms(&$fahrten$search)
{
    foreach (
$fahrten as $key => $element) {
        if (
$search === $element['code']) {
            unset(
$fahrten[$key]);
            break;
        }
    }

…verbraucht keinen zusätzlichen Speicher.

Da er aber auch nicht wirklich stört, würde ich den Umweg mit $found dennoch drinlassen. Nicht zuletzt auch deshalb, weil derlei Beobachtungen eben auch fragil sind.

Zitat:
Zitat von combie
Naja... 0.5 Sekunden Laufzeitdifferenz bei je 10000 Durchläufen...
Wir sprechen also über Zeiten, Optimierungen, welche weit unter einem tausendstel einer Sekunde liegen. (auf meinem ollen 32Bit Klapperkasten)
Das hängt davon ab, wie man den Benchmark aufbaut. Wenn du da 10000 Aufrufe der zu testenden Funktion hast und ein Array mit nur 5 Elementen und wenn du dazu auch noch pro Durchlauf das Array neu initialisiert (weil ja ein Element entfernt wird), dann misst du zum Beispiel eine ganze Menge Overhead mit, der für jeden Test die gleiche konstante Zeit dauert.

Ich habe es mal so getestet:

PHP-Code:
<?php

function merms(array &$fahrten$search)
{
    
$found false;

    foreach (
$fahrten as $key => $element) {
        if (
$search === $element['code']) {
            
$found true;
            break;
        }
    }

    if (
$found === true) {
        unset(
$fahrten[$key]);
    }
}

function 
combie(array &$fahrten$search)
{
    
$fahrten array_filter($fahrten,
        function (
$datensatz) use ($search) {
            return 
$datensatz['code'] !== $search;
        }
    );
}

$fahrten = array();

for (
$i 0$i 100$i++) {
    
$fahrten[] = array("code" => 1420484575"datum" => 20150107"strecke" => "PL->A""vorname" => "Thomas" $i);
    
$fahrten[] = array("code" => 1420484676"datum" => 20150107"strecke" => "PL->A""vorname" => "Kersten" $i);
    
$fahrten[] = array("code" => 1420484700"datum" => 20150107"strecke" => "PL->A""vorname" => "Matthias" $i);
    
$fahrten[] = array("code" => 1420484926"datum" => 20150112"strecke" => "PL->A""vorname" => "Michael" $i);

    
// Stelle, an der gesuchtes Element eingefügt wird
    
if ($i === 75) {
        
$fahrten[] = array("code" => 1420484634"datum" => 20150107"strecke" => "PL->A""vorname" => "Michael");
    }
}



var_dump(memory_get_peak_usage());                     // Speicherverbrauch vor Funktion

$search 1420484634;
$check  count($fahrten);
$start  microtime(true);

                                                       
// Hier eine Funktion einkommentieren
#merms($fahrten, $search);
combie($fahrten$search);

var_dump(((microtime(true) - $start) * 1000) . ' ms'); // Laufzeit
var_dump(count($fahrten) === $check 1);              // Eins entfernt?
var_dump(memory_get_peak_usage());                     // Speicherverbrauch nach Funktion
Da komme ich auf meinem System immer mindestens auf einen Faktor von 3. Je weiter vorne das gesuchte Element steckt, desto extremer wird natürlich der Unterschied.

Dein Ansatz scheint übrigens nicht die doppelte Menge an Speicher zu verbrauchen. Da wird intern wohl noch irgendwas optimiert.

Zitat:
Ich könnte mir Situationen vorstellen, in welchen das wichtig ist. Aber hier vermutlich nicht.
Joa, Performance-Thema eben…
Mit Zitat antworten