2009-12-31 11 views
5

मैंने हाल ही में कुछ स्थानों पर देखा है कि लोग कह रहे हैं कि PHP की रिकर्सन की खराब क्षमता है। हाल ही में मैंने ग्राफ ट्रैवर्सल के लिए एक रिकर्सिव PHP फ़ंक्शन लिखा और जावा की तुलना में यह बहुत धीमी गति से पाया। मुझे नहीं पता कि यह पुनरावृत्ति के लिए PHP की क्षमता के कारण है या क्योंकि सामान्य रूप से जावा की तुलना में PHP धीमा है।पुनरावृत्ति को संभालने की PHP की क्षमता

कुछ Googling इस (http://bugs.php.net/bug.php?id=1901)

पता चला [7 अगस्त 1999 12:25 यूटीसी] सीवीएस पर ज़ीव डॉट php डॉट नेट

पीएचपी 4.0 (Zend) गहन डेटा के लिए ढेर का उपयोग करता है, ढेर का उपयोग करने के बजाय। इसका मतलब है कि इसकी सहिष्णुता रिकर्सिव फ़ंक्शन महत्वपूर्ण रूप से अन्य भाषाओं की तुलना में कम है।

यह अपेक्षाकृत Zend बताने के लिए इस डेटा के लिए उपयोग करने के लिए ढेर नहीं , और बजाय ढेर का उपयोग आसान है - जो बहुत पुनरावर्ती संभव कार्यों की संख्या बढ़ जाएगी - कम गति की कीमत में। यदि आप ऐसी सेटिंग में दिलचस्पी रखते हैं, तो मुझे पता है, हम एक संकलन-समय स्विच जोड़ सकते हैं।

यह कहने का क्या अर्थ है कि php गहन डेटा के लिए ढेर का उपयोग करता है? क्या php रन-टाइम स्टैक सेट नहीं करता है? साथ ही, क्या यह सामान्य रूप से सच है कि PHP में रिकर्सन अन्य भाषाओं की तुलना में बहुत धीमी है? और कितना?

धन्यवाद!

+6

पवित्र प्राचीन बंद कर दिया कीड़े बैटमैन! – cgp

+2

altCognito एक बिंदु है। क्या आप PHP4 का भी उपयोग कर रहे हैं? या आप 5 पर हैं? – fennec

उत्तर

2

ठीक है, मैं इसमें एक स्टैब ले जाऊंगा।

पहला: "स्टैक" मानक सी/सी ++ प्रकार के कार्यक्रमों में फ़ंक्शन कॉल ट्रैकिंग के लिए उपयोग किया जाने वाला क्षेत्र है। यह एक ऐसी जगह है जहां ऑपरेटिंग सिस्टम और प्रोग्रामिंग भाषा सम्मेलन स्मृति में परिभाषित होते हैं, और इसका इलाज स्टैक (डेटा संरचना) जैसा होता है। जब आप एक सी फ़ंक्शन fibbonaci(int i) पर कॉल करते हैं तो यह चर i, और उस फ़ंक्शन का रिटर्न पता जो पहले से ही कॉल करने में व्यस्त था, स्टैक पर रखता है। इसमें कुछ स्मृति होती है। जब यह फ़ंक्शन कॉल के साथ किया जाता है, तो स्मृति फिर से उपलब्ध होती है। ढेर सीमित आकार का है। यदि आप इस पर बहुत बड़े चर भंडारण कर रहे हैं और कई बार रिकर्सिव कॉल कर रहे हैं, तो आप कमरे से बाहर हो सकते हैं। सही?

तो .....

जाहिर Zend डेटा आवंटित करने के लिए दो तरीके हैं: (क अधिक-सामान्य क्षेत्र से स्मृति अनुरोध करने के लिए) ढेर पर और स्टैक पर, और ढेर एक अधिक कुशल है चीजों को प्रोग्राम किए जाने के तरीके के कारण उन्हें प्राप्त करना। (मुझे नहीं पता क्यों, लेकिन मुझे लगता है। बहुत कम स्तर की कैशिंग चिंताओं हो सकती है - मुझे उम्मीद है कि ढेर में मनमानी स्मृति की तुलना में स्टैक एल 1 या एल 2 कैश में होना पसंद है, क्योंकि सीपीयू है वास्तव में उस क्षेत्र का उपयोग करने की संभावना बहुत अधिक होती है - हर बार जब आप एक फ़ंक्शन कहते हैं, तो वास्तव में हेप डेटा एक्सेस के लिए आवंटन ओवरहेड भी हो सकता है।)

इस संदर्भ में "गहन" डेटा, मेरा मानना ​​है, डेटा को संदर्भित करता है जो बहुत जल्द या अक्सर इस्तेमाल किया जाने की संभावना है। इन चर के लिए स्पीड स्टैक-आधारित आवंटन का उपयोग करना समझदारी होगी। आप किस प्रकार के चर का उपयोग बहुत जल्दी उपयोग कर रहे हैं? खैर, फ़ंक्शन के पैरामीटर के बारे में कैसे? आप उन लोगों का उपयोग करने की बहुत संभावना रखते हैं: अन्यथा आप उन्हें पास करने के लिए परेशान क्यों होंगे?वे शायद छोटे डेटा आइटम (विशाल डेटा संरचनाओं के बजाय बड़े पैमाने पर डेटा संरचनाओं के संदर्भ में भी पसंद करते हैं - क्योंकि इससे आपको अन्य चीजों के अलावा ओवरहेड की प्रतिलिपि मिलती है)। इसलिए स्टैक शायद अधिकांश PHP प्रोग्रामर के लिए PHP फ़ंक्शन पैरामीटर को संग्रहीत करने के लिए समझ में आता है ... लेकिन यह जल्द ही रिकर्सन में विफल रहता है।

उम्मीद है कि कम से कम इसका जवाब क्या है "इसका क्या अर्थ है?"। आपके रिकर्सन प्रदर्शन प्रश्न के लिए: इसे स्वयं बेंचमार्क करें; यह शायद इस बात पर निर्भर करता है कि आप किस प्रकार की रिकर्सन करने की कोशिश कर रहे हैं।

+0

@Eric: प्रदर्शन को मापने के विषय पर, एक्सडीबग PHP प्रोफाइलिंग (http://xdebug.org/docs/profiler) प्रदान करता है। – outis

0

अनुमान में, मैं कहूंगा कि आपकी समस्या रिकर्सन से कहीं और कहीं है। कई चीजों के लिए, जावा PHP से बहुत तेज है। PHP के प्रदर्शन में सुधार करने के तरीके हैं।

हालांकि, डरावनी 'स्टैक ओवरफ़्लो' संदेश (इच्छित इरादे के प्रकार) के साथ PHP में रिक्त स्थान क्रैश और क्रैश होने से PHP रिकर्सन सीमा परिणाम समाप्त होता है। इस बिंदु पर, आपका प्रोग्राम निष्पादित करना बंद कर देता है।

यदि PHP गतिशील ढेर का उपयोग कर रहा है, तो आप स्मृति के बड़े ब्लॉक में स्टैक को फिर से चलाने के लिए कुछ समय (हल्के) मंदी देख सकते हैं।

वैसे भी, मैं आप अपने प्रदर्शन समस्या है, जो कुछ मैं जीने के लिए करना है इंगित करने के लिए कर रहे हैं क्या बारे में कुछ और जानने की जरूरत होगी ...

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