2008-10-08 7 views
28

He analizado XML utilizando tanto de los dos métodos siguientes ...¿Qué es más eficiente para analizar Xml, XPath con XmlDocuments, XSLT o Linq?

  • Analizar el XmlDocument utilizando el modelo de objetos y consultas XPath.
  • XSL/T

Pero nunca he usado ...

  • El modelo de objetos LINQ XML que era nuevo para .NET 3.5

Puede alguien decirme el comparativo la eficiencia entre las tres alternativas?

Me doy cuenta de que el uso particular sería un factor, pero solo quiero una idea aproximada. Por ejemplo, ¿la opción de Linq es masivamente más lenta que las demás?

Respuesta

43

La forma más rápida y absoluta de consultar un documento XML es la más difícil: escriba un método que use un XmlReader para procesar la secuencia de entrada y haga que procese los nodos a medida que los lee. Esta es la forma de combinar el análisis y la consulta en una sola operación. (El simple hecho de usar XPath no hace esto, tanto XmlDocument como XPathDocument analizan el documento en sus métodos de carga). Esta suele ser una buena idea si está procesando flujos de datos XML extremadamente grandes.

Los tres métodos que ha descrito funcionan de manera similar. XSLT tiene mucho espacio para ser el más lento del lote, porque le permite combinar las ineficiencias de XPath con las ineficiencias de la coincidencia de plantillas. Las consultas XPath y LINQ hacen esencialmente lo mismo, que es una búsqueda lineal a través de listas enumerables de nodos XML. Esperaría que LINQ sea marginalmente más rápido en la práctica porque XPath se interpreta en tiempo de ejecución mientras LINQ se interpreta en tiempo de compilación.

Pero, en general, la forma de escribir la consulta va a tener un impacto mucho mayor en la velocidad de ejecución de lo que la tecnología que utiliza.

La forma de escribir consultas rápidas contra documentos XML es la misma ya sea que esté utilizando XPath o LINQ: formule la consulta para que se visiten la menor cantidad posible de nodos durante su ejecución. No importa qué tecnología utilice: una consulta que examine todos los nodos del documento se ejecutará mucho más lentamente que una que solo examine un pequeño subconjunto de ellos. Su capacidad para hacerlo depende más de la estructura del XML que de cualquier otra cosa: un documento con una jerarquía de elementos navegables generalmente será mucho más rápido de consultar que uno cuyos elementos son todos elementos secundarios del elemento del documento.

Editar:

Aunque estoy bastante seguro de que tengo razón de que la manera más rápida absoluta para consultar un XML es el más duro, la verdadera manera más rápida (y más difícil) no utiliza un XmlReader; usa una máquina de estado que procesa directamente los caracteres de una secuencia. Al igual que analizar XML con expresiones regulares, esta es generalmente una idea terrible. Pero te da la opción de intercambiar funciones por velocidad. Al decidir no manejar las piezas de XML que no necesita para su aplicación (por ejemplo, resolución de espacio de nombres, expansión de entidades de caracteres, etc.) puede construir algo que busque a través de una secuencia de caracteres más rápido que un XmlReader. Puedo pensar en aplicaciones donde ni siquiera es una mala idea, aunque no puedo pensar en muchas.

+1

Vea también http://stackoverflow.com/questions/407350/how-best-to-use-xpath-with-verylarge-xml-files-in-c/716659#716659, en el que señalo al lector XPathReader que combina la velocidad de XmlReader con la facilidad de uso de XPath –

+0

XPathReader es una idea realmente sobresaliente que desconocía por completo. Gracias por señalarme. –

+2

La disponibilidad de PLINQ (Parallel Linq) en .NET 4.0 hace que Linq sea una opción aún más atractiva que antes. Para ser justos, PLINQ realmente está lanzando más caballos de fuerza al problema; no está haciendo que el analizador sea más eficiente. Pero en general Linq logra un buen equilibrio entre brevedad y rendimiento. –

2

que en realidad no lo he probado, pero Linq es principalmente una función de tipo compilador de código-gen, y lo que debe ser comparable a la utilización de un XmlDocument y consultas XPath.

El valor principal de LINQ es que proporciona la verificación en tiempo de compilación de sus instrucciones de consulta, que puede proporcionar ni XPath ni XSLT.

Me gustaría pensar que si el rendimiento es una preocupación, su decisión se basa en la tarea en cuestión. Por ejemplo, recuperar un solo valor de un documento XML puede ser más rápido usando una sola consulta XPath, pero traducir datos XML a una página HTML sería más rápido usando XSLT.

+3

Linq no es un "compilador de código gen". Es un grupo de métodos estáticos contra IEnumerables genéricos. http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods.aspx LinqToXml no proporciona garantías en tiempo de compilación, porque la estructura xml es desconocida en tiempo de compilación. Acceso por cadena –

+1

Microsofts declaró que el propósito de Linq era proporcionar validación en tiempo de compilación de la declaración de expresión (para XPath, SQL, etc.) así como una única sintaxis de consulta genérica, no verificación contra la fuente de datos. –

3

consultas LinqToXml trabajan contra el contrato IEnumerable ... la mayor parte de sus operaciones son O (N), ya que requieren iteración sobre el IEnumerable.

Si lo que estás comenzando es una cadena que contiene xml, para poder trabajar con ella en Linq, necesitarás analizarla en el gráfico de objetos completo usando XElement.Parse, luego iterar sobre partes de la misma (para filtrarla) , por ejemplo).

Mi comprensión de XPath es que va a filtrar durante el análisis, lo que podría ser muy ventajoso desde el punto de vista del rendimiento. El gráfico de objeto completo no necesita ser construido.

2

Si desea un procesamiento XML (lectura) realmente rápido, debería considerar el uso de XmlReader, lamentablemente la implementación es un poco difícil.

También hay una manera de implementar la solución LINQ con una combinación de XmlReader para que pueda tener la facilidad de uso de LINQ. También puede obtener un rendimiento mucho mejor que XmlDocument/XPath.

Consulte el siguiente enlace para obtener más información al respecto. http://blogs.msdn.com/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx

También creo que si solo trabajas con pequeños archivos XML utilizando XmlDocument/XPath no será un problema de rendimiento.

Cuestiones relacionadas