मैं SimpleXML क्लास का उपयोग करके एक आरएसएस पार्सर का निर्माण कर रहा हूं और मैं सोच रहा था कि DOMDocument क्लास का उपयोग करने से पार्सर की गति में सुधार होगा। मैं एक आरएसएस दस्तावेज पार्स कर रहा हूं जो कम से कम 1000 लाइनें है और मैं उन 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 लाइनें एक बड़ा एक्सएमएल दस्तावेज नहीं है। आपकी मंदी स्मृति उपयोग या पार्सिंग गति में नहीं बल्कि आपके आवेदन तर्क में होगी।
ठीक है, मुझे DomDocument
और SimpleXML
के बीच एक बड़ा प्रदर्शन अंतर आया है।
...
<ITEM>
<Product>some product code</Product>
<Param>123</Param>
<TextValue>few words</TextValue>
</ITEM>
...
मैं केवल करने के लिए उन मूल्यों "पढ़ें" और उन्हें पीएचपी सरणी में बचाने की जरूरत है: मैं ~ 15 एमबी इस तरह लगभग 50 000 तत्वों के साथ बड़ा एक्सएमएल फ़ाइल है। पहले तो मुझे 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
}
कि स्क्रिप्ट के बाद अधिकतम निष्पादन समय के साथ 60 सेकंड त्रुटि को पार कर मौत हो गई। 50k के केवल 15 000 आइटम पार्स किए गए थे।
तो मैं SimpleXML
संस्करण के लिए कोड दुबारा लिखा:
$xml = new SimpleXMLElement($external_content);
foreach($xml->xpath('ITEM') as $item) {
$product_code = (string) $item->Product;
// ... some other operation
}
1 दूसरा सब किया गया था के बाद।
मुझे नहीं पता कि उन कार्यों को PHP में आंतरिक रूप से कार्यान्वित किया गया है, लेकिन मेरे आवेदन (और मेरी एक्सएमएल संरचना के साथ) वास्तव में, वास्तव में DomDocument
और SimpleXML
के बीच वास्तव में बड़ा प्रदर्शन अंतर है।
एक्सपैथ का उपयोग करने और उनके टैग द्वारा तत्व प्राप्त करने में बहुत बड़ा अंतर है। उन स्क्रिप्ट्स के व्यवहार के आधार पर निर्णय लेते हुए, xpath फ़ंक्शन वास्तव में सभी तत्वों को एक बार में पुनर्प्राप्त नहीं करता है, जो आपको इसके बजाय एक इटरेटर ऑब्जेक्ट प्रदान करता है - जो काफी हल्का और तेज़ होगा। यह लोडिंग फ़ाइलों के समान है - आप एक बार में एक बड़ी फ़ाइल लोड कर सकते हैं या प्रत्येक पंक्ति को पढ़ सकते हैं। चूंकि प्रत्येक पंक्ति को पढ़ने के लिए सब कुछ एक बार में स्मृति में लोड करने की आवश्यकता नहीं होती है, यह बेहतर प्रदर्शन करेगा। – SteveB
उपरोक्त टिप्पणी सही है, यह DomDocument बनाम SimpleXML के बारे में नहीं है, इसके बारे में आप कैसे पुनरावृत्त करते हैं। GetElementsByTagName से DOMXPath तक DomDocument पर पुनरावृत्ति को बदलना, इसे जितना तेज़ बनाता है। ~ 120,000 तत्व दस्तावेज़ पर मेरे परीक्षण इस बात की पुष्टि करते हैं – BobbyTables
- 1. SimpleXML को DOMDocument में कनवर्ट करें, DOMElement
- 2. DOMDocument :: loadXML बनाम HTML संस्थाओं
- 3. एक PHP DOMDocument ऑब्जेक्ट
- 4. SimpleXml
- 5. DOMDocument
- 6. domdocument
- 7. DOMDocument
- 8. DOMDocument को <as & lt
- 9. कैसे अधिमानतः SimpleXML
- 10. कैलियर प्रदर्शन बनाम UIImageView प्रदर्शन
- 11. एक DOMDocument पुनरावृत्ति प्रदर्शन को बेहतर बनाने के लिए कैसे?
- 12. प्रदर्शन या प्रदर्शन का प्रदर्शन (||) बनाम ऐरे()
- 13. SimpleXML सरणी
- 14. PHP5: DOMDocument
- 15. PHP DOMDocument
- 16. प्रदर्शन - Date.now() बनाम Date.getTime() बनाम
- 17. डेटाकंट्रैक्टसेरियलाइज़र बनाम बाइनरीफॉर्मेटर प्रदर्शन
- 18. strftime प्रदर्शन बनाम snprintf
- 19. प्रदर्शन बनाम गुणवत्ता कोड
- 20. सीएसवी बनाम MySQL प्रदर्शन
- 21. प्रदर्शन: XDocument बनाम XmlDocument
- 22. प्रदर्शन स्ट्रिंगबफ बनाम स्ट्रिंग
- 23. प्रदर्शन काउंटर बनाम ईटीडब्ल्यू
- 24. जेनिक्स बनाम ऑब्जेक्ट प्रदर्शन
- 25. प्रदर्शन: बाइनरीफॉर्मेटर बनाम एक्सएमएलएसरियलाइज़र
- 26. ओपनसीएल बनाम ओपनएमपी प्रदर्शन
- 27. MySQL प्रदर्शन: बनाम कहां
- 28. क्यूटी बनाम जीटीके + प्रदर्शन
- 29. अद्यतन बनाम INSERT प्रदर्शन
- 30. RenderAction बनाम RenderPartial प्रदर्शन
मैं यह भी जोड़ूंगा कि न केवल * पार्सिंग * समान है, लेकिन अधिकांश सामान्य कार्य समान प्रदर्शन के बारे में भी प्रदान करते हैं। यदि आपका आवेदन एक के साथ धीमा है, तो यह दूसरे के साथ धीमा हो जाएगा। –
धन्यवाद कि यह एक बहुत अच्छा प्रदर्शन था। मेरे पास सिर्फ एक और सवाल है। क्या होगा यदि मैं केवल फ़ीड से एक टैग का मूल्य प्राप्त करना चाहता हूं। कौन सा तेजी से होगा या समय के रूप में समय अंतर कमजोर होगा? धन्यवाद! – mhlas7
आपको बेंचमार्किंग के बारे में और अधिक विशिष्ट होना चाहिए। (एक के लिए, डीओएम/एसएक्सई में "टैग" नहीं हैं!) तत्व प्राप्त करने के कई तरीके हैं - ट्रैवर्सल या XPath द्वारा, और XPath के साथ कई समकक्ष XPaths हैं जो अलग-अलग प्रदर्शन करेंगे। आप बेंचमार्क क्यों नहीं करते? सबसे महत्वपूर्ण बात यह है कि, क्या आपने * अनुकूलन की आवश्यकता * का सामना किया है? सबसे अधिक संभावना है कि आपको गति के बारे में चिंता करने की ज़रूरत नहीं है और समय-समय पर माइक्रो-ऑप्टिमाइज़िंग कर रहे हैं। –