2008-10-08 8 views
28

Ich habe mit XML beide der folgenden zwei Methoden analysiert ...Was ist effizienter für die Analyse von Xml, XPath mit XmlDocuments, XSLT oder Linq?

  • das XmlDocument Parsen des Objektmodells und XPath-Abfragen verwendet wird.
  • XSL/T

Aber ich habe noch nie verwendet ...

  • Das Objekt Linq Xml Modell, das neu war 3,5

.NET Kann mir jemand die vergleichende sagen Effizienz zwischen den drei Alternativen?

Ich weiß, dass die bestimmte Verwendung ein Faktor wäre, aber ich möchte nur eine grobe Idee. Zum Beispiel, ist die Option Linq massiv langsamer als die anderen?

Antwort

43

Die absolut schnellste Methode zum Abfragen eines XML-Dokuments ist die schwierigste: Schreiben Sie eine Methode, die einen XmlReader verwendet, um den Eingabestream zu verarbeiten und Prozessknoten beim Lesen zu verarbeiten. Auf diese Weise können Analyse und Abfrage zu einer einzigen Operation kombiniert werden. (Die Verwendung von XPath führt dies nicht aus; sowohl XmlDocument als auch XPathDocument analysieren das Dokument in den Load-Methoden.) Dies ist normalerweise nur dann sinnvoll, wenn Sie extrem große XML-Datenströme verarbeiten.

Alle drei beschriebenen Methoden funktionieren ähnlich. XSLT bietet viel Platz, um das langsamste zu sein, da Sie die Ineffizienzen von XPath mit den Ineffizienzen des Template-Matchings kombinieren können. XPath- und LINQ-Abfragen machen im Wesentlichen dasselbe, nämlich das lineare Durchsuchen von aufzählbaren Listen von XML-Knoten. Ich würde erwarten, dass LINQ in der Praxis geringfügig schneller ist, da XPath zur Laufzeit interpretiert wird, während LINQ zur Kompilierzeit interpretiert wird.

Aber im Allgemeinen, wie Sie Ihre Abfrage schreiben wird einen viel größeren Einfluss auf die Ausführungsgeschwindigkeit als die Technologie, die Sie verwenden.

Die Möglichkeit, schnelle Abfragen für XML-Dokumente zu schreiben, ist dieselbe, unabhängig davon, ob Sie XPath oder LINQ verwenden: formulieren Sie die Abfrage so, dass während der Ausführung so wenig Knoten wie möglich besucht werden. Es spielt keine Rolle, welche Technologie Sie verwenden: Eine Abfrage, die jeden Knoten im Dokument untersucht, wird viel langsamer laufen als eine, die nur eine kleine Teilmenge davon untersucht. Ihre Fähigkeit, dies zu tun, hängt mehr von der Struktur des XML ab als alles andere: Ein Dokument mit einer navigierbaren Hierarchie von Elementen wird im Allgemeinen viel schneller abgefragt werden als eines, dessen Elemente alle untergeordneten Elemente des Dokumentelements sind.

Edit:

Während ich bin mir ziemlich sicher, dass ich Recht habe, dass der absolute schnellste Weg, um eine XML-Abfrage ist die härteste, die wirkliche schnellste (und schwierigsten) Art und Weise verwendet keine XmlReader; Es verwendet eine Zustandsmaschine, die Zeichen aus einem Stream direkt verarbeitet. Wie das Analysieren von XML mit regulären Ausdrücken ist das normalerweise eine schreckliche Idee. Aber es gibt Ihnen die Möglichkeit, Funktionen für Geschwindigkeit auszutauschen. Wenn Sie sich entscheiden, diese XML-Teile nicht zu verarbeiten, die Sie für Ihre Anwendung nicht benötigen (z. B. Namespace-Auflösung, Erweiterung von Zeicheneinheiten usw.), können Sie etwas erstellen, das schneller durch einen Zeichenstrom sucht als ein XmlReader. Ich kann mir Anwendungen vorstellen, bei denen das überhaupt keine schlechte Idee ist, obwohl ich an viele nicht denken kann.

+1

Siehe auch http://stackoverflow.com/questions/407350/how-best-to-use-xpath-with-y-large-xml-files-in-c/716659#716659, auf den ich den Leser hinweisen XPathReader, der die Geschwindigkeit von XmlReader mit der Benutzerfreundlichkeit von XPath kombiniert –

+0

XPathReader ist eine wirklich hervorragende Idee, die mir völlig unbekannt war. Danke, dass du mich darauf hingewiesen hast. –

+2

Die Verfügbarkeit von PLINQ (Parallel Linq) in .NET 4.0 macht Linq zu einer noch attraktiveren Option als zuvor. Um fair zu sein, wirft PLINQ wirklich mehr Pferdestärken auf das Problem; Es macht den Parser nicht effizienter. Aber insgesamt ist Linq ein gutes Gleichgewicht zwischen Kürze und Leistung. –

2

Ich habe es nicht tatsächlich getestet, aber Linq ist in erster Linie eine Compiler-Code-Gen-Typ-Funktion, und so sollte es mit der Verwendung eines XmlDocument und XPath-Abfragen vergleichbar sein.

Der primäre Wert von Linq ist, dass es eine Kompilierungszeitprüfung Ihrer Abfrageanweisungen bereitstellt, die weder von XPath noch von XSLT bereitgestellt werden können.

Ich würde denken, dass, wenn Leistung ein Anliegen ist, Ihre Entscheidung auf der vorliegenden Aufgabe basieren würde. Beispielsweise kann das Abrufen eines einzelnen Werts aus einem XML-Dokument mit einer einzelnen XPath-Abfrage am schnellsten erfolgen, das Übersetzen von XML-Daten in eine HTML-Seite wäre jedoch schneller, wenn XSLT verwendet wird.

+3

Linq ist kein "Compiler-Code-Gen". Es ist eine Reihe von statischen Methoden gegen generische IEnumerables. http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods.aspx LinqToXml bietet keine Kompilierzeitgarantien, da die XML-Struktur zum Zeitpunkt der Kompilierung unbekannt ist. Zugriff durch String –

+1

Microsofts erklärter Zweck von Linq war es, eine Kompilierungszeit-Validierung der Ausdruckanweisung (für XPath, SQL usw.) sowie eine einzige generische Abfragesyntax bereitzustellen - keine Verifizierung gegen die Datenquelle. –

3

LinqToXml-Abfragen arbeiten mit dem IEnumerable-Kontrakt ... die meisten Operationen sind O (N), da sie eine Iteration über IEnumerable erfordern.

Wenn Sie mit einer Zeichenfolge beginnen, die xml enthält, müssen Sie sie in das vollständige Objektdiagramm unter Verwendung von XElement.Parse analysieren und dann Teile davon durchlaufen (um sie zu filtern) , beispielsweise).

Mein Verständnis von XPath ist, dass es beim Parsen filtern wird, was vom Standpunkt der Leistung aus sehr vorteilhaft sein könnte. Der vollständige Objektgraph muss nicht konstruiert werden.

2

Wenn Sie wirklich schnelle XML-Verarbeitung (Lesen) wollen, sollten Sie die Verwendung von XmlReader in Betracht ziehen, leider ist die Implementierung etwas schwierig.

Es gibt auch eine Möglichkeit, die LINQ-Lösung mit einer Kombination aus XmlReader zu implementieren, damit Sie LINQ einfach verwenden können. Außerdem können Sie eine viel bessere Leistung als XmlDocument/XPath erzielen.

Bitte beachten Sie den folgenden Link für weitere Informationen zu diesem Thema. http://blogs.msdn.com/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx

Auch ich denke, wenn Sie nur mit kleinen XML-Dateien arbeiten mit XmlDocument/XPath wird kein Leistungsproblem sein.