200 likes | 296 Views
Performancebetrachtung typischer XML-Operationen. Seminar XML und intelligente Systeme Wintersemester 05/06 Uni Bielefeld. Lebenszyklus eines XML-Dokuments. Parsen. Zugriff. Modifikation. Serialisierung. Gliederung des Vortrages. Komplexitätsanalyse XML-Dokumente im Speicher
E N D
Performancebetrachtung typischer XML-Operationen Seminar XML und intelligente Systeme Wintersemester 05/06 Uni Bielefeld Janick Martinezjmartine@techfak.uni-bielefeld.de
Lebenszyklus eines XML-Dokuments Parsen Zugriff Modifikation Serialisierung Janick Martinez
Gliederung des Vortrages • Komplexitätsanalyse • XML-Dokumente im Speicher • elementare XML-Operationen • Zugriff auf bestimmte Knoten • Testrelationen • Datenstruktur-Modifikationen • komplexe XML-Operationen Janick Martinez
Komplexitätsanalyse • Einteilung von Algorithmen in Komplexitätsklassen • O(f) „obere Schranke“ • Θ(f) „obere und untere Schranke“ • Ω(f) „untere Schranke“ • „Reduktion auf Funktion der höchsten Ordnung und Abstraktion von konstanten Faktoren“ Beispiel: 5n²+3n Die Funktion 5n²+3n „wächst im wesentlichen nicht schneller“ als die Funktion n² O(?) O(n²) Janick Martinez
Beispiel Komplexitätsanalyse • Funktion zur Ermittlung des Mini- / Maximums eines Arrays • Bestimmende Eingabegröße: Länge des Arrays • Bestimmende Operation: „Vergleichen“ min = array[0] max = array[0] i = 1 while (i < array.length()) if(array[i] < min) then min = array[i] if(array[i] > max) then max = array[i] i++ end Schleife wird n-1 mal ausgeführt Pro Durchlauf je-weils ein Vergleich ZeitkostenfunktionT(n) = 2(n-1) O(n) • 2(n-1) Ermittlung des Mini- / Maximums erfordert lineare Zeit Janick Martinez
Bestimmende Eingabegrößen • Gesamtanzahl an Elementen • Anzahl Kinder eines Knotens • Tiefe des Baumes Bibliothek Bibliothek Bibliothek Bibliothek number of elements Buch n Buch 1 Buch 1 Buch 1 Buch 1 Buch 2 Buch 2 Buch 2 Buch 2 Buch n Buch m fanout „typisch“ < 10 Autor Autor Autor Autor Titel Titel Titel Titel ISBN ISBN ISBN ISBN Ausleihliste Ausleihliste Ausleihliste Ausleihliste Entleiher n Entleiher n Entleiher n Entleiher n Entleiher 1 Entleiher 1 Entleiher 1 Entleiher 1 depth „typisch“ 8 - 13 Janick Martinez
XML-Elementen im Speicher Kind 2 • Felder (arrays) • Kern: indizierte Feld-Elemente • sehr schneller Zugriff inkonstanter Zeit • Speicherschonend • Unvorteilhaft im Zusammen-hang mit Datenstruktur-modifikationen Feld-Indices Children[ ] 1 2 3 … 4 Kind x Children[ ] O(1) x Knoten Children[ ] O(n) … Kind n … Children[ ] n-1 n … Janick Martinez
XML-Elementen im Speicher • Verknüpfte Liste (Linked-Lists) • Kern: Referenzen auf Knoten • Relativ schneller Zugriff • Etwas speicherbelastender als Arrays • Hierarchische Struktur leicht aufzubauen • Vorteilhaft im Zusammen-hang mit Datenstruktur-modifikationen Knoten O(n) myParent firstChild nextSibling … O(n + fanout*depth) Kind 2 Kind 3 Kind 1 myParent myParent myParent firstChild firstChild firstChild nextSibling nextSibling nextSibling … … … Janick Martinez
XML-Elementen im Speicher • Auslassende Liste (Skip-Lists) • Spezielle Erweiterung einer Linked-List • Auf Wahrscheinlichkeitsverteilungen basierend • Schneller Zugriff auf einzelneElemente • Nur geringfügig erhöhterSpeicherverbrauch • Erst sinnvoll bei größeremfanout Kopf Terminator O(log(n)) max Layer n´ter Layer Janick Martinez Kind 1 Kind 2 Kind 3 Kind 4 Kind 5
Zugriff auf bestimmte Knoten Datenstruktur Operation Knoten mit ID/Key X O(number of elements) • seriell ≈ O(1) • per Suchliste (z.B. HashTable) O(1) O(fanout) O(log(fanout)) N-te Kind von Knoten Y Attribut- und Textzugriff eines Knoten O(1) • Suchliste vom Parser aufgebaut • Kostet zusätzliche Zeit • Attribute und Text direkt mit Knoten assoziiert • Speicherung innerhalb des Knotens • Referenzierung der Daten • Verwendung von ReferenzenfirstChild und nextSibling Janick Martinez
i = 0 while (i < lastChildNumber) child = parentNode.getChildN(i) myNodeList.add(node) i++ end Beabsichtigt: ersten N Kinder eines Knotens erhalten Hier: getChildN() mit ReferenzenfirstChild und nextSibling realisiert Mögliche Gefahr durch getChildN() O(fanout²) • Bessere Alternative: direkter Gebrauch der nextSibling Referenz des gefundenen Kindes O(fanout) Janick Martinez
Zugriff auf andere Verwandte Am Beispiel vorherigen Geschwister • 1. Wie im vorherigen Code-Beispiel • 2. Durch zusätzliche Referenzen Rechenintensiv Speicherintensiv Allgemeiner Trade-Off RechenzeitSpeicher Janick Martinez
Testrelationen Datenstruktur Operation O(1) X.isSiblingOf(Y) O(1) X.isChildOf(Y) O(depth) X. isDescendantOf(Y) • Überprüfung, obX.getParent() == Y.getParent() • Iteration über alle Vorfahren von X mittels X.getParent() und Überprüfung, ob Y gefunden wurde • Überprüfung, ob X.getParent() == Y Janick Martinez
Beispiel: X.isDescendantOf(Y) parentNode = nodeX.getParent() while (parentNode != null) if(parentNode == nodeY) then return true parentNode = parentNode.getParent() end return false wird maximal depth-1 mal ausgeführt O(depth) Janick Martinez
Datenstrukturmodifikationen Datenstruktur Operation O(fanout) Knoten einfügen O(fanout) / O(1) O(log(fanout)) / O(1) O(fanout) O(fanout) / O(1) Knoten löschen O(log(fanout)) / O(1) O(fanout) O(fanout) Knoten bewegen O(log(fanout)) • Einfügposition kann in linearer Zeit gefunden werden • Laufzeit abhängig von zu aktualisierenden Referenzen auf und innerhalb des neuen Knotens sowie von Bezügen wie „Anzahl Kinder“, Kosten hierfür aber konstant • Architekturabhängig • 1. Kinder des eingefügten Knotens direkt mit eingefügt • 2. Vorgang muss iterativ für jedes Kind wiederholt werden • Reduziert sich auf das Löschen des Knotens an der alten und Einfügen an der neuen Position • Laufzeit wie beim Einfügen abhängig von zu aktualisierenden Referenzen und Bezügen • Ebenfalls hoher konstanter Faktor wie beim Einfügen • Einfügposition kann in logarithmischer Zeit ermittelt werden • Konstanter Faktor jedoch leicht höher als bei einer Linked-List • Problem von Arrays: Begrenzte Größe • Array muß neu angelegt werden, benötigt lineare Zeit • Aber: impraktikabeler konstanter Faktor sehr hoch Janick Martinez
Beispiel: Einfügen in Linked-List O(1) parentNode.incrementChildNumber() newNode.setParent(parentNode) if(n == 0) then newNode.setFollowing(parentNode.getFirstChild()) parentNode.setFirstChild(newNode) return precidingSibbling = parentNode.getFirstChild() i = 1 while (i < n) precidingSibbling = precidingSibbling.getNextSibbling() i++ end newNode.setFollowing(precidingSibbling.getNextSibbling()) precidingSibbling.setNextSibbling(newNode) O(1) wird maximal fanout-1 mal ausgeführt O(fanout) O(1) • Funktion zum Einfügen eines neuen Knotens newNode an die Stelle n O(fanout) Janick Martinez
Komplexe XML-Operationen • Komplexe XML-Operationen • Machen starken Gebrauch und sind zusammengesetzt aus elementaren Operationen • Laufzeit der primitiveren Operationen ist ausschlaggebend für die der komplexeren Operationen Janick Martinez
Beispiel: Alle Kinder mit Attribut X = Y O(fanout) • Funktion zur Ermittlung aller Kinder eines Knotens mit bestimmten Attribut • XPath: /node/child[@X=Y] • Nutzt primitivere OperationengetChildren() und getAttribute() children = node.getChildren() while (children.hasNext()) currentChild = children.next() if (currentChild.getAttribute(X) == Y) then myNodeList.add(currentChild) end return myNodeList O(fanout) O(1) O(fanout) • Laufzeitabhängigkeit von elementaren Operationen • Bspw: schlechtere Implementierung von getChildren() mit O(fanout²) O(fanout²) Janick Martinez
Fazit • Interne API Implementierung sollte bekannt sein und berücksichtigt werden, um effiziente XML verarbeitende Programme zu erstellen • XML bringt keine neuen Erkenntnisse im Bezug auf effiziente Datenverarbeitung, sondern baut auf verlässlichen Algorithmen auf Quellen • S. DeRose, „Architecture and Speed of Common XML Operations“, Extreme Markup Languages 2005, August 2005 • Google… Zum Abschluss:Beispielhaftes Benchmark der XOM Java Implementierung Janick Martinez
Benchmark XOM API • 2. Element bewegen • Vom Anfang an das Ende • Vom Ende zum Anfang • 1. Element einfügen • Am Beginn • In die Mitte • An das Ende • 3. Bewegen komplexer Elemente Janick Martinez