में ऑब्जेक्ट तक पहुंचने पर भारी प्रदर्शन गिरावट मुझे एक सरल असाइनमेंट (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
क्या आप हमें 'print_r ($ मान) दे सकते हैं; मर; '? –
मैंने एक 'var_dump ($ मान) 'किया था, लेकिन चूंकि' वैल्यू 'ऑब्जेक्ट की एक प्रॉपर्टी एक और ऑब्जेक्ट है जिसके बदले में अन्य ऑब्जेक्ट्स की एक श्रृंखला है, डंप कमांड लाइन बफर की 10'000 लाइनों की तुलना में काफी लंबा हो जाता है । – Pascal
दूसरे शब्दों में, 'मान' ऑब्जेक्ट्स छोटी वस्तुएं नहीं हैं, लेकिन वास्तव में बड़े ऑब्जेक्ट ग्राफ़ के शीर्ष हैं? –