200 likes | 296 Vues
Explore complexity analysis, XML manipulations, and data access techniques. Learn about XML parsing, modification, and serialization for intelligent systems. Dive into algorithms' categorization and example complexity evaluations. Contact Janick Martinez for more information.
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