Bug gefunden: array_diff() in PHP >= 5.2.6 unglaublich langsam.

Neulich habe ich ein Projekt auf einen anderen Server umgezogen. Nicht nur die zugrunde liegende Hardware veränderte sich, sondern auch das Betriebssystem, nämlich von Debian Etch auf Debian Lenny. Nachdem alles nötige angepasst war, habe ich einen Testlauf gemacht und mich hat fast der Schlag getroffen: Der Code der auf der alten Hardware noch 20 Minuten gebraucht hatte, lief über eine Stunde bis die Ausführung des Skriptes dann ziemlich genervt abgebrochen habe.

Nach kurzer Analyse des Codes fand ich den Übeltäter sehr schnell. In dem Code werden md5-Prüfsummen in 2 Arrays mit array_diff() verglichen. Bei ca. 500.000 Elementen in beiden Arrays hat die Ausführung auf dem alten System wenige Sekunden gedauert und auf dem neuen System länger als eine Stunde. Mein Fix dafür war ein selbstgeschriebenes array_diff() welches folgendermaßen aussieht:

function array_diff_fast($data1, $data2) {
    $data1 = array_flip($data1);
    $data2 = array_flip($data2);

    foreach($data2 as $hash => $key) {
       if (isset($data1[$hash])) unset($data1[$hash]);
    }

    return array_flip($data1);
}

Vielleicht hilft das ja jemandem.

BTW. der Bug wurde hier gemeldet: http://bugs.php.net/bug.php?id=47643

Mrz 24th, 2009 | Posted in Linux, Programmieren
Tags: ,
  1. Apr 28th, 2010 at 02:37 | #1

    many thanks for your share!

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>