2010-12-26 16 views
10

इस प्रश्न को here से पहले पूछा गया था, लेकिन किसी भी उत्तर ने वास्तव में पूछे गए वास्तविक प्रश्न का उत्तर देने की कोशिश नहीं की, इसलिए मैं इसे एक अलग तरीके से पूछ रहा हूं। 100,000 कार्यों के साथ 20,000 लाइनों की एक एकल कक्षा लोड कर रहा है, जो कम से कम कार्यों के साथ छोटे वर्गों को कोड तोड़ने और आवश्यकतानुसार इन छोटे वर्गों को लोड करने से किसी भी तरह से अधिक संसाधन गहन है?20K लाइनों का उपयोग करते समय "प्रदर्शन प्रभाव" एकल वर्ग

+4

जाहिर की जरूरत नहीं है, बहुत छोटी है , यह उपयोग के मामले पर निर्भर करता है। यदि आप उन्हें तोड़ते हैं, और केवल 1% का उपयोग करके इसे समाप्त करते हैं और केवल 1% लोड करते हैं, निश्चित रूप से यह 100% लोड करने और फिर 1% का उपयोग करने से कम संसाधन-गहन होगा। – houbysoft

+1

आप यहां दो अलग-अलग चीजें पूछ रहे हैं। "प्रदर्शन प्रभाव" zilch है। जबकि "संसाधन गहन", हां यह स्मृति-वार है। यदि आप अपने कोड को छोटे हिस्सों में तोड़ देते हैं, तो आपके पास कम मेमोरी उपयोग होगा, लेकिन अंत में अधिक I/O। सामान्यीकृत सलाह के बजाय xdebug का प्रयोग करें। – mario

+3

निष्पादन यहां आपकी चिंता नहीं होनी चाहिए ... लाभ जो आप रखरखाव में लाएंगे और कोड को पढ़ने में सक्षम होंगे, वे शायद (संभवतः मामूली) प्रदर्शन प्रभाव से अधिक हो जाएंगे। – Thanatos

उत्तर

6

एक स्क्रिप्ट या कक्षा जितनी बड़ी होगी, प्रति उदाहरण यह अधिक स्मृति का उपयोग करेगी। बॉक्स के बाहर, PHP के पास पुस्तकालयों और कक्षाओं की मेमोरी स्पेस साझा करने का कोई तरीका नहीं है, इसलिए वेबसाइट के लिए भारी स्क्रिप्ट बनाना एक अच्छा विचार नहीं है।

विशिष्ट दृष्टिकोण ब्लॉक में कक्षाओं को तोड़ने के लिए होना चाहिए जैसे कि आपको केवल उस स्क्रिप्ट को चलाने की आवश्यकता है, जिसे आपको वास्तव में उस स्क्रिप्ट को चलाने की आवश्यकता है।

इसके अलावा, आपके पास प्रदर्शन समस्याओं का कारण होने की संभावना नहीं है जब तक कि आपके पास बड़ी मात्रा में यातायात न हो - और फिर आप कक्षाओं को पुन: सक्रिय करने से आपकी समस्याओं को आसानी से ठीक कर सकते हैं।

जब कोई स्क्रिप्ट लोड हो जाती है, तो उसे पार्स करने के लिए निश्चित मात्रा में स्मृति की आवश्यकता होती है। जितना बड़ा होगा उतना अधिक स्मृति की आवश्यकता होगी। इसके बाद, स्क्रिप्ट स्वयं निष्पादित की जाती है, किसी भी शीर्ष-स्तरीय कोड को चलाती है ( कक्षा या वैश्विक फ़ंक्शन में नहीं)। यदि इसमें किसी भी आवश्यकता/शामिल बयानों को शामिल किया गया है, तो उन स्क्रिप्ट को लोड किया जाता है (यदि आवश्यक हो)। यदि यह ऑब्जेक्ट बनाता है, तो इसमें अधिक मेमोरी होती है।

हालांकि, कक्षा के प्रत्येक उदाहरण का आकार केवल उस डेटा द्वारा प्रभावित होता है जो इसे संग्रहीत करता है। यह सुधार एक तरफ है, यहां सलाह दी गई है: जिम्मेदारियों के आधार पर अपनी कक्षाओं को विभाजित करें। इसका कारण प्रदर्शन की तुलना में विकास की आसानी से भी करना है। मान लें कि आपके पास स्थैतिक तरीकों से भरा एक राक्षस वर्ग है। यदि आपका एप्लिकेशन प्रत्येक अनुरोध के लिए उन तरीकों में से अधिकांश का उपयोग करता है, तो विभाजन के लिए इसका कोई प्रदर्शन लाभ नहीं होगा क्योंकि दोनों स्क्रिप्ट किसी भी तरह लोड होने लगेंगे। लेकिन यदि आप तार्किक उपप्रणाली में विधियों को समूहित कर सकते हैं, तो उन्हें समझना और काम करना आसान होगा।

+0

सहमत हुए। एक तंत्र जो इसे आसान बना सकता है (आपके पुस्तकालय को एकल वर्गों और फ़ाइलों में विभाजित करने के बाद) PHP 5 है [ऑटोलोडिंग] (http://www.php.net/manual/en/language.oop5.autoload.php)। –

+0

@ पेक्का, कृपया एक शब्द का उल्लेख न करें। मैं आधिकारिक तौर पर इसे नफरत करता हूं, क्योंकि मुझे समझ में नहीं आता कि इसे कैसे जोड़ना है। – jblue

+0

@jblue, क्या आप 'ऑटोलोडिंग' के बारे में बात कर रहे हैं? इसके लिए कुछ अच्छे ट्यूटोरियल हैं, यदि आपको कोई समस्या है। – shamittomar

4

एक बड़ी कक्षा को बाइनरी कोड (ओप-कोड) में संकलित करने के लिए एकल चक्र की आवश्यकता होती है।

कम स्मृति का उपयोग करके कई छोटे वर्गों को अधिक संकलन की आवश्यकता होती है, और संकलन के लिए स्मृति उपयोग जमा किया जाएगा।

वास्तव में निर्भर करता है कि रन-टाइम में कितनी कक्षाएं/फ़ाइलें शामिल की गई हैं।

तो, इसके लिए समाधान, कई कक्षाओं में तोड़ने और APC या समकक्ष का उपयोग करें।

पुनश्च: बड़ी फ़ाइल के लिए स्मृति की खपत क्योंकि पीएचपी सेशन-कोड में स्रोत फिर से संकलित करने के लिए (यदि आप अनिच्छुक छोटे में बड़ा वर्ग को तोड़ने के लिए)

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