** Esto está dirigido principalmente a aquellos que comienzan con XML Parsing y no están seguros de qué analizador usar.
Existen dos "grandes" formas de realizar el análisis: puede cargar el XML en la memoria y encontrar lo que necesita (DOM, SimpleXML) o puede transmitirlo, leerlo y ejecutar el código según lo que lea (XMLReader, SAX).
According to Microsoft, SAX es un analizador "push", que envía cada información a su aplicación y la procesa. SimpleXML es un analizador "pull", que le permite omitir fragmentos de datos y solo obtener lo que necesita. Según Microsoft, esto puede simplificar y acelerar su aplicación, y supongo que las implementaciones de .NET y PHP son similares. Supongo que su elección dependería de sus necesidades: si está sacando solo algunas etiquetas de un trozo más grande y puede usar el $xml->next('Element')
para omitir fragmentos significativos, es posible que XMLReader sea más rápido que SAX.
Analizando "pequeño" (< 30kb, 700 líneas) archivos XML repetitivamente, es posible que no espere que haya una gran diferencia de tiempo entre los métodos de análisis. Me sorprendió descubrir que había. Ejecuté una comparación de un feed pequeño procesado en SimpleXML y XMLReader. Es de esperar que esto ayude a otra persona a visualizar cuán importante es esta diferencia. Para una comparación de la vida real, se trata de analizar la respuesta a dos feeds de solicitud de Amazon MWS Product Information.
Cada Parse Time es el tiempo requerido para tomar 2 cadenas XML y devolver aproximadamente 120 variables que contienen valores de cada cadena. Cada ciclo toma datos diferentes, pero cada una de las pruebas estaba en los mismos datos en el mismo orden.
SimpleXML carga el documento en la memoria.Usé microtime para verificar tanto el tiempo para completar el análisis (extraer los valores relevantes), como el tiempo dedicado a crear el elemento (cuando se llamó al new SimpleXMLElement($xml)
). Los redondeé a 4 decimales.
Parse Time: 0.5866 seconds
Parse Time: 0.3045 seconds
Parse Time: 0.1037 seconds
Parse Time: 0.0151 seconds
Parse Time: 0.0282 seconds
Parse Time: 0.0622 seconds
Parse Time: 0.7756 seconds
Parse Time: 0.2439 seconds
Parse Time: 0.0806 seconds
Parse Time: 0.0696 seconds
Parse Time: 0.0218 seconds
Parse Time: 0.0542 seconds
__________________________
2.3500 seconds
0.1958 seconds average
Time Spent Making the Elements: 0.5232 seconds
Time Spent Making the Elements: 0.2974 seconds
Time Spent Making the Elements: 0.0980 seconds
Time Spent Making the Elements: 0.0097 seconds
Time Spent Making the Elements: 0.0231 seconds
Time Spent Making the Elements: 0.0091 seconds
Time Spent Making the Elements: 0.7190 seconds
Time Spent Making the Elements: 0.2410 seconds
Time Spent Making the Elements: 0.0765 seconds
Time Spent Making the Elements: 0.0637 seconds
Time Spent Making the Elements: 0.0081 seconds
Time Spent Making the Elements: 0.0507 seconds
______________________________________________
2.1195 seconds
0.1766 seconds average
over 90% of the total time is spent loading elements into the DOM.
Only 0.2305 seconds is spent locating the elements and returning them.
Mientras que el XMLReader, que se basa corriente, yo era capaz de saltar una parte significativa de una de las fuentes XML ya que los datos que quería era cerca de la parte superior de cada elemento. "Su experiencia puede ser diferente."
Parse Time: 0.1059 seconds
Parse Time: 0.0169 seconds
Parse Time: 0.0214 seconds
Parse Time: 0.0665 seconds
Parse Time: 0.0255 seconds
Parse Time: 0.0241 seconds
Parse Time: 0.0234 seconds
Parse Time: 0.0225 seconds
Parse Time: 0.0183 seconds
Parse Time: 0.0202 seconds
Parse Time: 0.0245 seconds
Parse Time: 0.0205 seconds
__________________________
0.3897 seconds
0.0325 seconds average
Lo que es sorprendente es que a pesar de la localización de los elementos es ligeramente más rápido en SimpleXML una vez que se ha cargado todo, en realidad es más de 6 veces más rápido usar XMLReader general.
Puede encontrar información sobre el uso de XMLReader en How to use XMLReader in PHP?
Es hilos de seguridad realmente una preocupación? El 99% de las aplicaciones de PHP tienen un solo subproceso. –
Estoy bastante seguro de que está hablando de condiciones de carrera [en función de otra cuestión suya] (http://stackoverflow.com/questions/3030122/is-splfileobject-atomic/3048658#3048658). – Charles
Me temo que es. Supongo que usaré SimpleXML. Sin embargo, no tengo idea de su rendimiento. –