SimpleXML 클래스를 사용하여 RSS 파서를 작성 중이며 DOMDocument 클래스를 사용하면 파서의 속도가 향상되는지 궁금합니다. 나는 적어도 1000 개의 라인 인 rss 문서를 파싱하고 있으며 나는 그 1000 개의 라인으로부터 거의 모든 데이터를 사용한다. 완료하는 데 최소한의 시간이 걸리는 방법을 찾고 있습니다.SimpleXML 대 DOMDocument 성능
답변
SimpleXML
및 DOMDocument
모두 동일한 파서 (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 문서가 아닙니다. 속도 저하는 메모리 사용이나 구문 분석 속도가 아니라 응용 프로그램 논리에 있습니다.
음, 나는 DomDocument
과 SimpleXML
사이에 큰 성능 차이가 발생했습니다. 난 단지 그 값을 "읽기"및 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 구조)에는 실제로는 DomDocument
과 SimpleXML
사이에 큰 성능 차이가 있습니다.
xpath를 사용하고 태그로 요소를 가져 오는 데는 큰 차이가 있습니다. 이러한 스크립트가 어떻게 동작하는지에 따라 판단하면 xpath 함수는 실제로 모든 요소를 한 번에 복구하지 않으므로 대신 반복기 객체를 제공하므로 훨씬 가볍고 빠릅니다. 파일로드와 동일합니다. 한 번에 큰 파일을로드하거나 모든 행을 읽을 수 있습니다. 모든 라인을 읽는 것은 모든 것을 한번에 메모리에로드 할 필요가 없기 때문에 더 나은 성능을 발휘합니다. – SteveB
위의 설명은 정확합니다. DomDocument와 SimpleXML이 아니라 반복하는 방법입니다. DomDocument의 반복을 getElementsByTagName에서 DOMXPath로 변경하면 속도가 빨라집니다. ~ 120.000 요소 문서에 대한 내 테스트에서이 사실을 확인합니다. – BobbyTables
- 1. 속도 : DOMDocument 대 xml_parse_into_struct 대 strrpos
- 2. SimpleXML 개체를 PHP의 DOMDocument 개체로 캐스팅 할 수 있습니까?
- 3. CALayer 성능 대 UIImageView 성능
- 4. nspropertylistserialization 대 nsjsonserialization의 성능
- 5. XLinq 대 SqlDataReader 성능
- 6. 성능 : XDocument 대 XmlDocument
- 7. 타이머 대 DispatcherTimer 성능
- 8. aspx 대 html 성능
- 9. GridView 대 DataGrid 성능
- 10. DataContractSerializer 대 BinaryFormatter 성능
- 11. 서블릿 대 Struts2 성능
- 12. strftime 성능 대 snprintf
- 13. CALayer 대 drawInRect : 성능?
- 14. ListView.click 대 Button.Click의 성능
- 15. .NET 대 정규식 성능
- 16. XPath 대 DOM의 성능
- 17. 필드 대 실제 성능
- 18. 대 C++ 성능
- 19. 성능 카운터 대 ETW
- 20. adaptIntegrate의 성능 대 통합
- 21. web_reg_find 대 strstr(). 성능
- 22. Phonegap 앱 성능 대 기본 앱 성능
- 23. MySQL의 성능 - "중복"대 속도/시스템 성능
- 24. DynamicObject 및 TrySetMember 성능 대 ExpandoObject 성능
- 25. Simplexml XPath stranggeness
- 26. 자바에서 루프의 성능 (대 비트 시프트가없는 대, 대 동안)
- 27. HtmlUnit 대 HttpUnit의 성능 비교
- 28. WPF DataContext 대 ItemsSource 성능
- 29. C# : XNA 대 XNA (성능)
- 30. ESENT 성능 Vista 대 XP
나는 또한 * parsing *이 동일 할뿐만 아니라 대부분의 일반적인 태스크가 거의 동일한 성능을 제공한다고 덧붙인다. 응용 프로그램이 느리면 응용 프로그램이 느려집니다. –
감사합니다. 아주 좋은 데모였습니다. 나는 한가지 더 질문이있다. 피드에서 하나의 태그 값만 가져 오려면 어떻게해야합니까? 위와 같이 어느 것이 더 빠르거나 시차가 중요하지 않습니까? 감사! – mhlas7
벤치마킹 대상에 대해 좀 더 구체적으로 설명해야합니다. DOM/SXE에는 "태그"가 없습니다! 요소를 가져 오는 방법은 여러 가지가 있습니다. 즉, 순회 또는 XPath를 사용하고 XPath에는 다르게 수행 할 수있는 여러 개의 동일한 XPath가 있습니다. 왜 벤치마킹하지 않니? 더 중요한 것은 최적화에 대한 필요성이 * 생겼습니까? 대부분 속도에 대해 걱정할 필요가 없으며 조기에 마이크로 최적화가 가능합니다. –