XPathSelectElement vs Descendientes
-
06-07-2019 - |
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")
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