2009-12-16 14 views
6

में ऑब्जेक्ट तक पहुंचने पर भारी प्रदर्शन गिरावट मुझे एक सरल असाइनमेंट (0.8 ~ 0.9 सेकेंड से 2 9 .x सेकेंड तक रनटाइम वृद्धि) के कारण एक (कमांड लाइन) PHP स्क्रिप्ट में एक बड़ी प्रदर्शन गिरावट दिखाई दे रही है।सहयोगी PHP सरणी

स्क्रिप्ट पहले एक MySQL डेटाबेस से बहुत अधिक डेटा प्राप्त करती है और विभिन्न कस्टम वर्गों की वस्तुओं को बनाती है। इस fetching के बाद (php अब लगभग 500 एमबी रैम का उपयोग करता है) मैं लगभग 3'500 Sample ऑब्जेक्ट्स की एक सरणी लूप करता हूं, जिनमें से प्रत्येक में इसके गुणों में से एक के रूप में एक एसोसिएटिव सरणी (आकार लगभग 100 प्रविष्टियां) होती है। इस सरणी में Value ऑब्जेक्ट्स हैं, जो दो गुणों वाली छोटी वस्तुएं हैं, और चाबियां 6'000 से छोटी हैं। यह वह जगह है जहां मैंने समस्या पर ठोकर खाई, यह कोड देखें:

foreach ($samples as $id => $s) { # $s is now a 'Sample' object 
    $values = $s->values();   # $values is an array of 'Value' objects 

    if (isset($values[$match_id])) { 
     $num_tested++; 
     # $val = $values[$match_id];  # contains a 'Value' object 
     # $val = &$values[...]; -> the loop never ends (!) 
    } 
} 

ध्यान दें कि लाइन पर टिप्पणी की गई है। यदि मैं कोड को यहां दिखाई देता हूं, तो यह ब्लॉक लगभग 0.8 से 0.9 सेकंड तक चलता है। अगर मैं इस सिंगल लाइन को अनमोल करता हूं, तो ब्लॉक लगभग 30 सेकंड के लिए चलता है। मैंने पाया कि यदि सरणी गैर-सहयोगी है (इसमें केवल 0 से लगभग 100 तक लगातार कुंजी होती है) रनटाइम केवल 1.8 ~ 1.9 सेकेंड तक बढ़ जाती है।
ऐसा लगता है कि यह लगातार उपयोग की जाने वाली गैर-सरणी सरणी कुंजी के कारण होता है, लेकिन फिर फिर से isset($values[$match_id]) पर कॉल करके प्रदर्शन क्यों पहले से नहीं आती है? क्या इसके लिए कोई कामकाज है या क्या मुझे इसके साथ रहना है?

पीएचपी 5.3.0 चल रहा है, जेंड इंजन v2.3.0, मैक ओएस एक्स सर्वर 10.6.2

+2

क्या आप हमें 'print_r ($ मान) दे सकते हैं; मर; '? –

+0

मैंने एक 'var_dump ($ मान) 'किया था, लेकिन चूंकि' वैल्यू 'ऑब्जेक्ट की एक प्रॉपर्टी एक और ऑब्जेक्ट है जिसके बदले में अन्य ऑब्जेक्ट्स की एक श्रृंखला है, डंप कमांड लाइन बफर की 10'000 लाइनों की तुलना में काफी लंबा हो जाता है । – Pascal

+0

दूसरे शब्दों में, 'मान' ऑब्जेक्ट्स छोटी वस्तुएं नहीं हैं, लेकिन वास्तव में बड़े ऑब्जेक्ट ग्राफ़ के शीर्ष हैं? –

उत्तर

3

आप 5.3 चला रहे हैं, नई Spl डेटा संरचनाओं पर गौर। बड़े संग्रहों के लिए एक महत्वपूर्ण प्रदर्शन बढ़ावा प्रदान कर सकता है, जैसा कि here और here दिखाया गया है। इसके अलावा, यह बताने में थोड़ा मुश्किल है कि समस्या का कारण क्या हो सकता है। क्या आपने अधिक जानकारी प्राप्त करने के लिए xdebug या Zend_Debugger का उपयोग करने का प्रयास किया है?

+0

नहीं, मैं 'xdebug' या ज़ेंड डीबगर से परिचित नहीं हूं। स्प्ल डेटा संरचनाओं की जांच कर रहा है ... – Pascal

+0

xdebug और Zend_Debugger आपको अपने आवेदन को प्रोफाइल करने की अनुमति देता है। वे आपको एक विस्तृत विश्लेषण दे सकते हैं कि किस तरीके को बुलाया जाता है, कितनी बार और कितनी देर तक वे दौड़ते हैं। xdebug मुफ्त है, तो इसे क्यों न देखें। – Gordon

1

(प्रतिलिपि द्वारा असाइनमेंट) को $val =& $values[$match_id] (संदर्भ द्वारा असाइनमेंट) के साथ बदलने का प्रयास करें और देखें कि यह बेहतर प्रदर्शन करता है या नहीं।

+0

PHP में ऑब्जेक्ट्स हमेशा संदर्भ द्वारा असाइन किए जाते हैं।यह उत्कृष्ट सलाह होगी यदि प्रत्येक $ वैल एक वस्तु नहीं थी, हालांकि। –

+0

मैंने तब से कोशिश नहीं की है - जैसे लुकास का उल्लेख है - ऑब्जेक्ट्स को हमेशा रेफरी द्वारा असाइन किया जाता है। इसके बारे में दिलचस्प बात यह है: ** लूप समाप्त नहीं होता ** (कम से कम यह 10 मिनट के बाद नहीं हुआ, जब मैंने इसे मारा) ... – Pascal

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