2012-02-20 39 views
7

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

19

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.

+0

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. –

+0

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

+2

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. –

-1

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.

+5

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

+3

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