2012-02-20 3 views
7

SimpleXML 클래스를 사용하여 RSS 파서를 작성 중이며 DOMDocument 클래스를 사용하면 파서의 속도가 향상되는지 궁금합니다. 나는 적어도 1000 개의 라인 인 rss 문서를 파싱하고 있으며 나는 그 1000 개의 라인으로부터 거의 모든 데이터를 사용한다. 완료하는 데 최소한의 시간이 걸리는 방법을 찾고 있습니다.SimpleXML 대 DOMDocument 성능

답변

19

SimpleXMLDOMDocument 모두 동일한 파서 (libxml2)를 사용하므로, 이들 사이의 파싱 차이는 무시할 수있다.

내 컴퓨터에
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(); 

나는 기본적으로 차이를 얻을 :

이 확인하기 쉬운

Time to complete 10000 reps: 
time_load_dd: 17.725028991699 
time_load_sxe: 17.416455984116 

여기 진짜 문제는 당신이 사용하고 당신이 함께 무엇을하고 있는지 알고리즘을 것입니다 데이터. 1000 줄은 큰 XML 문서가 아닙니다. 속도 저하는 메모리 사용이나 구문 분석 속도가 아니라 응용 프로그램 논리에 있습니다.

+0

나는 또한 * parsing *이 동일 할뿐만 아니라 대부분의 일반적인 태스크가 거의 동일한 성능을 제공한다고 덧붙인다. 응용 프로그램이 느리면 응용 프로그램이 느려집니다. –

+0

감사합니다. 아주 좋은 데모였습니다. 나는 한가지 더 질문이있다. 피드에서 하나의 태그 값만 가져 오려면 어떻게해야합니까? 위와 같이 어느 것이 더 빠르거나 시차가 중요하지 않습니까? 감사! – mhlas7

+2

벤치마킹 대상에 대해 좀 더 구체적으로 설명해야합니다. DOM/SXE에는 "태그"가 없습니다! 요소를 가져 오는 방법은 여러 가지가 있습니다. 즉, 순회 또는 XPath를 사용하고 XPath에는 다르게 수행 할 수있는 여러 개의 동일한 XPath가 있습니다. 왜 벤치마킹하지 않니? 더 중요한 것은 최적화에 대한 필요성이 * 생겼습니까? 대부분 속도에 대해 걱정할 필요가 없으며 조기에 마이크로 최적화가 가능합니다. –

-1

음, 나는 DomDocumentSimpleXML 사이에 큰 성능 차이가 발생했습니다. 난 단지 그 값을 "읽기"및 PHP 배열에 저장해야 할

... 
<ITEM> 
    <Product>some product code</Product> 
    <Param>123</Param> 
    <TextValue>few words</TextValue> 
</ITEM> 
... 

: 나는 ~ 15메가바이트이 ​​같은 약 50 000 요소와 큰 XML 파일이 있습니다. 처음에 나는 최대 실행 시간이 60 초 오류를 초과 한 후 그 스크립트가 사망

$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 
} 

... DomDocument을 시도했다. 50,000 개의 15,000 개 항목 만 구문 분석되었습니다. 모두 이루어졌다 일초

$xml = new SimpleXMLElement($external_content); 
foreach($xml->xpath('ITEM') as $item) { 
    $product_code = (string) $item->Product; 
    // ... some other operation 
} 

:

그래서 나는 SimpleXML 버전에 코드를 다시 썼다.

이러한 기능이 PHP에서 내부적으로 어떻게 구현되는지는 모르겠지만 내 응용 프로그램 (XML 구조)에는 실제로는 DomDocumentSimpleXML 사이에 큰 성능 차이가 있습니다.

+5

xpath를 사용하고 태그로 요소를 가져 오는 데는 큰 차이가 있습니다. 이러한 스크립트가 어떻게 동작하는지에 따라 판단하면 xpath 함수는 실제로 모든 요소를 ​​한 번에 복구하지 않으므로 대신 반복기 객체를 제공하므로 훨씬 가볍고 빠릅니다. 파일로드와 동일합니다. 한 번에 큰 파일을로드하거나 모든 행을 읽을 수 있습니다. 모든 라인을 읽는 것은 모든 것을 한번에 메모리에로드 할 필요가 없기 때문에 더 나은 성능을 발휘합니다. – SteveB

+3

위의 설명은 정확합니다. DomDocument와 SimpleXML이 아니라 반복하는 방법입니다. DomDocument의 반복을 getElementsByTagName에서 DOMXPath로 변경하면 속도가 빨라집니다. ~ 120.000 요소 문서에 대한 내 테스트에서이 사실을 확인합니다. – BobbyTables