1 / 20

Performancebetrachtung typischer XML-Operationen

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

daria-riley
Download Presentation

Performancebetrachtung typischer XML-Operationen

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Performancebetrachtung typischer XML-Operationen Seminar XML und intelligente Systeme Wintersemester 05/06 Uni Bielefeld Janick Martinezjmartine@techfak.uni-bielefeld.de

  2. Lebenszyklus eines XML-Dokuments Parsen Zugriff Modifikation Serialisierung Janick Martinez

  3. Gliederung des Vortrages • Komplexitätsanalyse • XML-Dokumente im Speicher • elementare XML-Operationen • Zugriff auf bestimmte Knoten • Testrelationen • Datenstruktur-Modifikationen • komplexe XML-Operationen Janick Martinez

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

More Related