2011-03-12 34 views
14

¿Alguien me aclarará alguna comparación de rendimiento integral entre XPath y DOM en diferentes escenarios? He leído algunas preguntas en SO, como xPath vs DOM API, which one has a better performance y XPath or querySelector?. Ninguno de ellos menciona casos específicos. Aquí hay algunas cosas con las que podría empezar.Rendimiento de XPath vs DOM

  1. Ninguna iteración involucrada. getElementById (foobar) vs // * [@ id = 'foobar']. ¿El primero es constantemente más rápido que el segundo? ¿Qué sucede si este último está optimizado, p./html/body/div [@ id = 'foo']/div [@ id = 'foobar']?
  2. Iteración involucrada. getElementByX luego recorre los nodos hijos frente a XPath y genera una instantánea, luego recorre los ítems de la instantánea.
  3. eje involucrado. getElementByX luego transversal para los próximos hermanos vs // following-sibling :: foobar.
  4. Diferentes implementaciones. Los diferentes navegadores y bibliotecas implementan XPath y DOM de forma diferente. ¿Qué implementación de navegador de XPath es mejor?

Como dice la respuesta en xPath vs DOM API, which one has a better performance, el programador promedio puede equivocarse al implementar tareas complicadas (por ejemplo, varios ejes involucrados) en modo DOM mientras se garantiza la optimización de XPath. Por lo tanto, mi pregunta solo se preocupa por las selecciones simples que se pueden hacer de ambas maneras.

Gracias por cualquier comentario.

+0

Como con casi cualquier pregunta sobre el rendimiento y la optimización, dependerá de sus circunstancias y contenido específicos. La respuesta es "perfila tu aplicación con tus datos, y elige la que sea más adecuada para ti". Además, has hecho demasiadas preguntas generales. Esto probablemente debería cerrarse como "no es una pregunta real", y si alguien más piensa, me uniré a ellos para votar. –

+0

Mi experiencia personal es que DOM suele ser más de 10 veces más rápido que XPath o la implementación de selector API (por ejemplo, Firefox).Sin embargo, dado que XPath acepta el nodo de contexto, tal vez sea mejor seleccionar un nodo padre "estable" con DOM y usar XPath para el trabajo de descanso. Esto puede ser de alto rendimiento y robusto. –

+0

XPath se puede construir en una API que no sea DOM, por ejemplo, la implementación xpath de vtd-xml se basa en descriptores de token virtuales ... –

Respuesta

22

XPath y DOM son especificaciones, no implementaciones. No puede hacer preguntas sobre el rendimiento de una especificación, solo sobre implementaciones específicas. Hay al menos una diferencia de diez a uno entre un motor XPath rápido y uno lento: y pueden optimizarse para diferentes cosas, p. algunos pasan mucho tiempo optimizando una consulta suponiendo que se ejecutará varias veces, lo que podría ser una acción incorrecta para la ejecución de un solo disparo. Lo único que se puede decir es que el rendimiento de XPath depende más del motor que esté utilizando, y el rendimiento de DOM depende más de la competencia del programador de la aplicación, porque es una interfaz de nivel inferior. Por supuesto, todos los programadores se consideran mucho mejores que el promedio ...

+0

+1 Para agregar diferencias entre los motores XPath en la mezcla. –

+0

¿Qué hay de la implementación más común: Firefox, Chrome, IE, Opera? Supongo que optimizan el motor de una manera bastante equilibrada. Bajo tal suposición, ¿hay alguna respuesta a la pregunta? –

+0

gracias por llamarme "mucho mejor que el promedio" :) –

2

Estoy de acuerdo con Michael en que puede depender de la implementación, pero generalmente diría que DOM es más rápido. La razón es porque no hay forma de que vea que puede optimizar el documento analizado para hacer que XPath sea más rápido.

Si está atravesando HTML y no XML, el analizador especializado puede indexar todos los identificadores y clases en el documento. Esto hará que getElementById y getElementsByClass sean mucho más rápidos.

Con XPath, solo hay una forma de encontrar el elemento de esa identificación ... atravesando, ya sea de arriba hacia abajo o de abajo hacia arriba. Puede memorizar consultas repetidas (o consultas parciales), pero no veo ninguna otra optimización que pueda hacerse.

3

Esta página tiene una sección donde puede ejecutar pruebas para comparar los dos y ver los resultados en diferentes navegadores. Por ejemplo, para Chrome, xpath es 100% más lento que getElementById.

Consulte getElementById vs QuerySelector para obtener más información.

+0

Hola Claudiu, bienvenido a StackOverflow! Si bien el enlace que publicó puede ser útil, el objetivo de StackOverflow es convertirse en un repositorio de conocimiento en los próximos años para que otros que visiten esta página puedan beneficiarse de su respuesta. Si el enlace alguna vez se rompiera, tu respuesta sería inútil. Considere editar su respuesta para incluir el ejemplo del enlace, de modo que si el enlace muere, su respuesta tiene valor. ¡Buena suerte y bienvenido a StackOverflow! :) – jmort253

+0

Seguí adelante e hice algunas mejoras. ¡Buena suerte! – jmort253