2012-02-20 19 views
7

मैं SimpleXML क्लास का उपयोग करके एक आरएसएस पार्सर का निर्माण कर रहा हूं और मैं सोच रहा था कि DOMDocument क्लास का उपयोग करने से पार्सर की गति में सुधार होगा। मैं एक आरएसएस दस्तावेज पार्स कर रहा हूं जो कम से कम 1000 लाइनें है और मैं उन 1000 लाइनों के लगभग सभी डेटा का उपयोग करता हूं। मैं उस विधि की तलाश में हूं जो पूरा करने में कम से कम समय लगेगा।SimpleXML बनाम DOMDocument प्रदर्शन

उत्तर

19

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 लाइनें एक बड़ा एक्सएमएल दस्तावेज नहीं है। आपकी मंदी स्मृति उपयोग या पार्सिंग गति में नहीं बल्कि आपके आवेदन तर्क में होगी।

+0

मैं यह भी जोड़ूंगा कि न केवल * पार्सिंग * समान है, लेकिन अधिकांश सामान्य कार्य समान प्रदर्शन के बारे में भी प्रदान करते हैं। यदि आपका आवेदन एक के साथ धीमा है, तो यह दूसरे के साथ धीमा हो जाएगा। –

+0

धन्यवाद कि यह एक बहुत अच्छा प्रदर्शन था। मेरे पास सिर्फ एक और सवाल है। क्या होगा यदि मैं केवल फ़ीड से एक टैग का मूल्य प्राप्त करना चाहता हूं। कौन सा तेजी से होगा या समय के रूप में समय अंतर कमजोर होगा? धन्यवाद! – mhlas7

+2

आपको बेंचमार्किंग के बारे में और अधिक विशिष्ट होना चाहिए। (एक के लिए, डीओएम/एसएक्सई में "टैग" नहीं हैं!) तत्व प्राप्त करने के कई तरीके हैं - ट्रैवर्सल या XPath द्वारा, और XPath के साथ कई समकक्ष XPaths हैं जो अलग-अलग प्रदर्शन करेंगे। आप बेंचमार्क क्यों नहीं करते? सबसे महत्वपूर्ण बात यह है कि, क्या आपने * अनुकूलन की आवश्यकता * का सामना किया है? सबसे अधिक संभावना है कि आपको गति के बारे में चिंता करने की ज़रूरत नहीं है और समय-समय पर माइक्रो-ऑप्टिमाइज़िंग कर रहे हैं। –

-1

ठीक है, मुझे 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 के बीच वास्तव में बड़ा प्रदर्शन अंतर है।

+5

एक्सपैथ का उपयोग करने और उनके टैग द्वारा तत्व प्राप्त करने में बहुत बड़ा अंतर है। उन स्क्रिप्ट्स के व्यवहार के आधार पर निर्णय लेते हुए, xpath फ़ंक्शन वास्तव में सभी तत्वों को एक बार में पुनर्प्राप्त नहीं करता है, जो आपको इसके बजाय एक इटरेटर ऑब्जेक्ट प्रदान करता है - जो काफी हल्का और तेज़ होगा। यह लोडिंग फ़ाइलों के समान है - आप एक बार में एक बड़ी फ़ाइल लोड कर सकते हैं या प्रत्येक पंक्ति को पढ़ सकते हैं। चूंकि प्रत्येक पंक्ति को पढ़ने के लिए सब कुछ एक बार में स्मृति में लोड करने की आवश्यकता नहीं होती है, यह बेहतर प्रदर्शन करेगा। – SteveB

+3

उपरोक्त टिप्पणी सही है, यह DomDocument बनाम SimpleXML के बारे में नहीं है, इसके बारे में आप कैसे पुनरावृत्त करते हैं। GetElementsByTagName से DOMXPath तक DomDocument पर पुनरावृत्ति को बदलना, इसे जितना तेज़ बनाता है। ~ 120,000 तत्व दस्तावेज़ पर मेरे परीक्षण इस बात की पुष्टि करते हैं – BobbyTables

संबंधित मुद्दे