Estoy construyendo un analizador de RSS utilizando la clase SimpleXML y me preguntaba si el uso de la clase DOMDocument mejoraría la velocidad del analizador. Estoy analizando un documento rss que tiene al menos 1000 líneas y uso casi todos los datos de esas 1000 líneas. Estoy buscando el método que tomará menos tiempo para completar.SimpleXML vs DOMDocument rendimiento
Respuesta
SimpleXML
y DOMDocument
ambos utilizan el mismo analizador (libxml2
), por lo que el análisis sintáctico diferencia entre ellos es insignificante.
Esto es fácil de comprobar:
function time_load_dd($xml, $reps) {
// discard first run to prime caches
for ($i=0; $i < 5; ++$i) {
$dom = new DOMDocument();
$dom->loadXML($xml);
}
$start = microtime(true);
for ($i=0; $i < $reps; ++$i) {
$dom = new DOMDocument();
$dom->loadXML($xml);
}
$stop = microtime(true) - $start;
return $stop;
}
function time_load_sxe($xml, $reps) {
for ($i=0; $i < 5; ++$i) {
$sxe = simplexml_load_string($xml);
}
$start = microtime(true);
for ($i=0; $i < $reps; ++$i) {
$sxe = simplexml_load_string($xml);
}
$stop = microtime(true) - $start;
return $stop;
}
function main() {
// This is a 1800-line atom feed of some complexity.
$url = 'http://feeds.feedburner.com/reason/AllArticles';
$xml = file_get_contents($url);
$reps = 10000;
$methods = array('time_load_dd','time_load_sxe');
echo "Time to complete $reps reps:\n";
foreach ($methods as $method) {
echo $method,": ",$method($xml,$reps), "\n";
}
}
main();
En mi máquina me sale básicamente, no hay diferencia:
Time to complete 10000 reps:
time_load_dd: 17.725028991699
time_load_sxe: 17.416455984116
El verdadero problema aquí es lo que los algoritmos que está utilizando y lo que está haciendo con el datos. 1000 líneas no es un gran documento XML. Su ralentización no estará en el uso de la memoria o en la velocidad de análisis, sino en la lógica de la aplicación.
Bueno, he encontrado una ENORME diferencia de rendimiento entre DomDocument
y SimpleXML
. Tengo ~ 15 MB de archivos XML grande con aproximadamente 50 000 elementos como esto:
...
<ITEM>
<Product>some product code</Product>
<Param>123</Param>
<TextValue>few words</TextValue>
</ITEM>
...
Sólo tengo que "leer" esos valores y guardarlos en la matriz PHP. Al principio traté DomDocument
...
$dom = new DOMDocument();
$dom->loadXML($external_content);
$root = $dom->documentElement;
$xml_param_values = $root->getElementsByTagName('ITEM');
foreach ($xml_param_values as $item) {
$product_code = $item->getElementsByTagName('Product')->item(0)->textContent;
// ... some other operation
}
Ese guión murió después de 60 segundos con tiempo máximo de ejecución superaron error. Solo se analizaron 15 000 elementos de 50k.
Así que volvieron a escribir el código para SimpleXML
versión:
$xml = new SimpleXMLElement($external_content);
foreach($xml->xpath('ITEM') as $item) {
$product_code = (string) $item->Product;
// ... some other operation
}
Después 1 segundo todo estaba hecho.
No sé cómo estas funciones se implementan internamente en PHP, pero en mi aplicación (y con mi estructura XML) realmente hay una diferencia de rendimiento MUY ENORME entre DomDocument
y SimpleXML
.
Hay una gran diferencia en el uso de xpath y solo obtener elementos por su etiqueta. A juzgar por cómo se comportan esos scripts, la función xpath en realidad no recupera todos los elementos a la vez, proporcionándole un objeto iterador en su lugar, que será significativamente más ligero y más rápido. Es lo mismo que con la carga de archivos: puede cargar un archivo enorme a la vez o leer cada línea. Ya que leer cada línea no requiere cargar todo en la memoria a la vez, funcionará mejor. – SteveB
El comentario anterior es correcto, no se trata de DomDocument vs SimpleXML, se trata de cómo iterar. Cambiar la iteración en DomDocument de getElementsByTagName a DOMXPath en su lugar, lo hace igual de rápido. Mis pruebas en un documento de ~ 120,000 elementos confirman esto – BobbyTables
- 1. Convertir SimpleXML en DOMDocument, no DOMElement
- 2. Servlet Vs Struts2 Rendimiento
- 3. Rendimiento vs legibilidad
- 4. git vs mercurial rendimiento
- 5. DataContractSerializer vs BinaryFormatter rendimiento
- 6. Qt vs GTK + rendimiento
- 7. Eventos vs. Rendimiento
- 8. RenderAction vs RenderPartial rendimiento
- 9. CSV vs MySQL rendimiento
- 10. nchar vs nvarchar rendimiento
- 11. Rendimiento - Date.now() vs date.getTime()
- 12. ReSharper VS CodeRush rendimiento
- 13. Cadena vs GString Rendimiento
- 14. JavaScript - === vs == operadores rendimiento
- 15. Rendimiento de GridView vs DataList vs Repeater vs ListView
- 16. NHibernate HQL vs CriteriaAPI vs QueryOver vs Linq. Rendimiento
- 17. groovy 'switch' vs. 'if' rendimiento
- 18. Rendimiento: URL absolutas vs. relativas
- 19. Rendimiento de ReceiveAsync vs. BeginReceive
- 20. Rendimiento de XPath vs DOM
- 21. OpenCL AMD vs NVIDIA rendimiento
- 22. rendimiento D: Unión vs @property
- 23. rendimiento de adaptIntegrate vs. integrar
- 24. Tabla vs Tabla temporal Rendimiento
- 25. Estrategia de registro vs. rendimiento
- 26. RichFaces Vs PrimeFaces (para rendimiento)
- 27. Rendimiento MDX vs. T-SQL
- 28. Genéricos vs Objeto de rendimiento
- 29. content_for vs rendimiento en parciales
- 30. Cómo evitar que DOMDocument guarde <as & lt
También agregaría que no solo * el análisis * es el mismo, sino que las tareas más comunes también ofrecen casi el mismo rendimiento. Si su aplicación es lenta con una, será lenta con la otra. –
Gracias fue una muy buena demostración. Solo tengo una pregunta más. ¿Qué ocurre si solo quiero obtener el valor de una etiqueta del feed? ¿Cuál sería más rápido o las diferencias de tiempo son insignificantes? ¡Gracias! – mhlas7
Necesita ser más específico acerca de lo que está evaluando. (¡Por un lado, DOM/SXE no tiene "etiquetas"!). Hay varias formas de obtener un elemento: por cruce o por XPath, y con XPath hay varios XPath equivalentes que funcionarían de manera diferente. ¿Por qué no comparas? Más importante aún, ¿has * encontrado * una necesidad de optimización? Lo más probable es que no tenga que preocuparse por la velocidad en absoluto y esté micro optimizando prematuramente. –