Pregunta

Me preguntaba si hay alguna diferencia de rendimiento al usar consultas simples como:

var x = document.XPathSelectElement("actors/actor")

vs

var x = document.Descendants("actors").Descendants("actor")
¿Fue útil?

Solución

Tenga en cuenta que esto

var x = document.Elements("actors").Elements("actor").FirstOrDefault();

es el equivalente de su primera declaración.

Habrá una diferencia de rendimiento, porque los métodos están haciendo cosas muy diferentes bajo el capó. Sin embargo, la optimización de operaciones puramente en memoria es un poco inútil a menos que se trate de un conjunto de datos grande. Si se trata de un conjunto de datos grande, debe medir el rendimiento de ambas alternativas en lugar de intentar predecir cuál funcionará más rápido.

Otros consejos

Parece que hay un golpe, alguien más ha hecho el trabajo preliminar de evaluación comparativa: http://blog.dreamlabsolutions.com/post/2008/12/04/LINQ-to-XML-and-LINQ-to-XML-with-XPath-performance-review.aspx

Sí, aunque las dos líneas no son equivalentes.

El XPath debe analizarse en última instancia en una expresión LINQ que luego haría esto: -

var x = document.Elements("actors").Elements("actor");

Sin embargo, es muy posible que internamente se almacene una versión compilada de la expresión XPath, de modo que usar una XPath solo cuesta el tiempo que lleva buscar la cadena en algún diccionario interno. Si ese es realmente el caso o no, no lo sé.

De mis pruebas limitadas, el rendimiento parece muy similar. Tomé un mensaje XML de muestra de http : //msdn.microsoft.com/en-us/library/windows/desktop/ms762271 (v = vs.85) .aspx

XPath:

/book[id='bk109']

Consulta LINQ:

from bookElement in xmlElement.Descendants( "book" )
where bookElement.Attribute( "id" ).Value == "bk109"
select bookElement

Luego ejecuté cada 10,000 veces (excluyendo el tiempo que tomó analizar la cadena y la primera ejecución para eliminar el ruido CLR).

Resultados (100,000 iteraciones)

  • XPath en XElement: 60.7 ms
  • LINQ to XML en XElement: 85,6 ms
  • XPath en XPathDocument: 43.7 ms

Entonces, parece que al menos en algunos escenarios la evaluación XPath en XElement funciona mejor que LINQ to XML. Las evaluaciones de XPath en XPathDocument son aún más rápidas.

Pero, parece que cargar un XPathDocument lleva un poco más de tiempo que cargar un XDocument (1000 iteraciones):

  • Tiempo para cargar XPathDocument: 92.3 ms
  • Tiempo para cargar XDocument: 81.0 ms
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top