PHP Benchmark preg_match vs. DOM
In PHP kann man Daten aus einer XML Datei auf mehrere Wege auslesen.
Der bekannteste Weg führt über die PHP DOM Functions, der DOM Level 2 API von PHP. Hierbei wird das XML Dokument geparst und als Objekt in den Arbeitsspeicher geladen. Möchte man nun auf Elemente und Daten der XML Datei zugreifen, kann mann über XPATH oder der DOM API schnell und einfach an die Daten heran kommen und diese zum Beispiel in PHP Variablen speichern und damit weiterarbeiten.
Eine weitere Möglichkeit in PHP XML Dateien auszulesen, ist das Laden der Datei in eine String Variable über file_get_contents(). Dabei wird einfach nur der Inhalt der Datei in die String Variabel geladen ohne etwas zu parsen. Dann kann man per preg_match oder auch preg_match_all aus diesem String über reguläre Ausdrücke die Daten der XML Datei auslesen, in Variablen speichern und ebenfalls damit dann weiterarbeiten.
Diese Variante ist für den Programmierer natürlich mit mehr denk Arbeit verbunden, also die Erste. Allerdings zeigt sich, in einem einfachen Benchmark, dass die preg_match Variante beim lesen und verarbeiten von Daten einer XML um fast das Doppelte schneller ist als die PHP DOM Functions.
Folgende XML Datei wird verarbeitet:
<todolist> <aufgabe> <titel>Preg Match und DOM vergleichen</titel> <datum>12.4.07</datum> <prioritaet>2</prioritaet> <zustaendig>ilimitado OHG</zustaendig> <beschreibung>Einen Benchmark über die Geschwindigkeitsunterschiede von Preg Match und DOM anfertigen</beschreibung> <anmerkungen>erledigt und veröffentlicht</anmerkungen> <deadline>18.4.07</deadline> <status>2</status> </aufgabe> </todolist>
Hier folgt ein einfaches Beispiel einer XML-Verarbeitung in PHP durch die PHP DOM Functions:
//PHP DOM Object erzeugen und XML Datei laden $list = new DOMDocument(); $list->preserveWhiteSpace=FALSE; $list->formatOutput=TRUE; $list->load('todolist.xml'); //PHP XPATH Objekt initialisieren $listXPath = new DOMXPath($list); //Array mit den Tagnamen für foreach Schleife belegen: $items[]='titel'; $items[]='datum'; $items[]='prioritaet'; $items[]='zustaendig'; $items[]='beschreibung'; $items[]='anmerkungen'; $items[]='deadline'; $items[]='status'; //jedes Tag auslesen foreach($items as $item) { //jedes Tag in <aufgabe> wird durch einen XPATH ausgelesen $data[$item] = $listXPath->query('/todolist/aufgabe/'.$item)->item(0)->nodeValue; } </aufgabe>
Das Selbe kann nun auch durch eine Art eigenen Parser durch preg_match erzeugt werden:
//laden der XML Datei in PHP $list = file_get_contents('todolist.xml'); //Array mit den Tagnamen für foreach Schleife belegen: $items[]='titel'; $items[]='datum'; $items[]='prioritaet'; $items[]='zustaendig'; $items[]='beschreibung'; $items[]='anmerkungen'; $items[]='deadline'; $items[]='status'; //für alle möglichen Tags: foreach($items as $item) { //(.*?) steht für beliebig viele beliebige Art von Zeichen, // am Ende /usi steht für u für unicode, i für groß/kleinschreibung ignorieren und s für Zeilenumbruch zulassen preg_match('/<aufgabe>(.*?)<'.$item.'>(.*?)<!--'.$item.'-->/usi',$list, $found); //was preg_match gefunden hat ist im Array $found gespeichert, an der Stelle 2 steht der gesuchte String. $data[$item] = $found[2]; } </aufgabe>
Am Ende steht im Array $data das Selbe, wobei die preg_match Variante einfach die schnellere gegenüber der DOM Variante ist. Vorallem bei einer großen Datei mit z.B. 1000 Einträgen (in diesem Fall Aufgaben) ist preg_match einfach schneller als DOM.
Natürlich muss man sich stets geeignete reguläre Ausdrücke für die preg_match Anweisung überlegen. Es ist komfortabler und manchmal vielleicht auch gar nicht so viel langsamer mit DOM zu operieren, das muss im Einzelfall getestet und bedacht werden. Mit etwas Übung und Routine klappt dies aber ganz gut und wenn es der Geschwindigkeit dient, ist man doch gerne bereit etwas Zeit in der Entwicklung zu opfern
Tags: Benchmark, DOM, PHP, XML

Letzte Kommentare