2011-12-19 16 views
6

मैं ज़ेंड फ्रेमवर्क 1.11, सिद्धांत 2, कुछ सिम्फनी 2 componenents और अन्य उपकरण & पुस्तकालयों के साथ एक परियोजना पर काम कर रहा हूं।मेरे प्रदर्शन को अनुकूलित करें

मैं Xdebug & वेबग्रिंड का उपयोग करके प्रदर्शन को अनुकूलित करने का प्रयास कर रहा हूं।

मुझे पहले से ही कुछ बाधाएं मिली हैं जैसे पाइरिंग इनआई कॉन्फ़िगर, आदि .. और उसे कैश किया गया।

अब, मैं सिर्फ पता है कि autoloading अपने आवेदन की सबसे महंगी हिस्सा है:

Opl\Autoloader\ApcLoader->loadClass     274 31.36 43.86 
    Zend_Loader_PluginLoader->load       150 4.80 12.29 
    Zend_Loader_Autoloader->getClassAutoloaders   278 1.42 1.91 
    Zend_Controller_Router_Route_Regex->_getMappedValues 291 1.29 1.35 
    Doctrine\ORM\UnitOfWork->createEntity     85 1.24 3.18 

आप मैं डिफ़ॉल्ट Zend_Loader_Autoloader का उपयोग नहीं कर रहा हूँ, मैं Opl है जो उपयोग कर रहा हूँ देख सकते हैं, के रूप में अब तक मुझे पता है, इससे तेज, मैं एपीसी कैश के साथ classMapLoader का उपयोग कर रहा हूं लेकिन यह अभी भी शेष एप्लिकेशन की तुलना में थोड़ा धीमा है।

मैं इसे कैसे अनुकूलित कर सकता हूं?

मेरे पास लगभग 250 वर्ग लोड हैं, और ऐसा लगता है कि केवल ~ 40 धीमे हैं, अन्य लोग 0,00 को "कुल कॉल लागत" के रूप में दिखाते हैं लेकिन अन्य आवश्यकता कॉल पर 0,08 से 0,57 तक बढ़ रहे हैं।

वैसे, ओपीएल ऑटोलोडर का उपयोग करने के बाद, ऐसा लगता है कि मेरे उत्पादन वातावरण पर एपीसी केवल ओपोड फ़ाइल को "मैन्युअल रूप से आवश्यक" है जिसे ऑटोलोडर द्वारा बुलाया जाता है।

उत्तर

4

यदि आपका कोड रीफैक्टर करना एक विकल्प नहीं है (ड्रॉप ज़ेंड फ्रेमवर्क, ड्रॉप डॉक्टर, ड्रॉप ...) मैं पहले बेहतर हार्डवेयर खरीदने में अनुकूलित करता हूं। यह स्वचालित रूप से आपके कोड को अनुकूलित करेगा, क्योंकि कोड का संदर्भ बस स्थानांतरित किया गया है (यह कोड को बिल्कुल अनुकूल नहीं कर रहा है, क्योंकि कोड नहीं बदलेगा)।

यदि यह विकल्प नहीं है तो खुद को एक बिल्ड सिस्टम बनाने के लिए विचार करें जो आपके कोडबेस को प्री-प्रोसेस कर सकता है और लोडिंग प्रक्रिया को काटने के लिए इसका एक गैर-विकास संस्करण बना सकता है। इसके लिए विश्लेषण की आवश्यकता होती है कि फ़ाइलों को हमेशा की आवश्यकता होती है और आप उन्हें सभी को लोडर-अनुकूलित प्रारूप में संकलित करते हैं जो एकल फ़ाइल और/या स्थैतिक वर्ग लोडर मानचित्र हो सकता है।

हालांकि यह ज्ञात है कि ज़ेंड को हमेशा स्मृति में बहुत लोड करने की आवश्यकता है। एपीसी जैसे PHP कैश का उपयोग करने से पहले भी आपको कुछ मिल सकता है (पहले उल्लेख की गई बिल्ड स्क्रिप्ट के साथ पूर्व-संकलन करने पर विचार करें और अपने मीट्रिक द्वारा हाइलाइट किए गए हिस्सों को अनुकूलित करें)।

यदि आपकी एप्लिकेशन संरचना इसकी अनुमति देती है, तो एक और संभावना भी है: अनुरोधों के बीच मेमोरी में अपना पूरा एप्लिकेशन रखें। यह एक PHP वेबसर्वर के साथ किया जा सकता है। ऐसा करने के बाद, सर्वर शुरू होने के बाद कोड को लोड करने की आवश्यकता होती है और उसे फिर से लोड करने की आवश्यकता नहीं होगी। यह केवल आपके अनुरोध के साथ काम करता है यदि यह एकाधिक अनुरोधों का समर्थन करता है। विशेष रूप से अनुरोध तर्क के साथ एक अच्छा encapsulated आवेदन उसके लिए काफी आसानी से अपनाया जा सकता है। एक मौजूदा समाधान appserver-in-php है। आप आश्चर्यचकित होंगे कि एपीसी से पहले से प्राप्त लाभों की तुलना में गति कितनी बढ़ जाती है।

शायद यह सहायक था। कोई भी अतिरिक्त, अधिक ठोस सुझाव बनाना मुश्किल है क्योंकि आपके कोड को कार्रवाई में देखना संभव नहीं है और न ही उस पर विस्तृत मीट्रिक है। आपने दृश्यों के पीछे क्या चल रहा है, इस पर एक टुकड़ा पारित कर दिया है, इसलिए आपको अधिक ठोस रूप से बताना मुश्किल है।

+0

आपका महान उत्तर धन्यवाद, असल में मेरी समस्या है कि मैं पुराने फैशन एप्लिकेशन से ZF1.7 और Zend_Db और इसके लेनदेन के साथ माइग्रेट हो गया हूं दर (घेराबंदी द्वारा दी गई) कुछ 30/40/एस की तरह लौटाती है जहां मेरा केवल 10 है, हालांकि मैंने कई अनुकूलन किए हैं जैसे क्वेरी ऑप्टिमाइज़ेशन जो वैश्विक स्तर पर अनुरोध समय को कम करता है लेकिन मैं इस तरह की दर के लिए थोड़ा निराश हूं। निश्चित रूप से नए हार्डवेयर को खरीदने का एक समाधान है, और यह होगा लेकिन मैं नहीं चाहता कि यह समाधान हो। ऑटोलोडर को देखते समय, ऐसा लगता है कि डॉक्टर को ज़ेंड फ्रेमवर्क की तुलना में अधिक फ़ाइल की आवश्यकता होती है। – Trent

+0

विचार करें कि क्या आपको वास्तव में अपने आवेदन में ओआरएम की आवश्यकता है। यदि आप नहीं करते हैं, तो सिद्धांत छोड़ें और * तालिका डेटा गेटवे * या * पंक्ति डेटा गेटवे * ज़ेंड लाइब्रेरी ऑफ़र का उपयोग करें। या पीडीओ में PHP देशी mysql ड्राइवर के साथ बस अपने स्वयं के डीबी abstraction के लिए चिपके रहें। यदि डेटाबेस आपकी बाधा है, तो छोटे कोड के लिए अपना कोड और डेटाबेस एक साथ लाएं। यह ओआरएम ऑफ़र के कुछ आराम विकल्पों को कम कर सकता है, लेकिन आप माइस्क्ल स्टोरेज में डेटा लाने और पुश करने के लिए अपना स्वयं का फ़ंक्शन बनाकर अपना स्वयं का आराम कर सकते हैं। – hakre

+1

मुझे सभी प्रकार की चीजें छोड़ने के सुझाव पसंद हैं (यानी हल्का)। मुझे सुझाव नहीं है कि "बेहतर हार्डवेयर खरीदना। यह स्वचालित रूप से आपके कोड को अनुकूलित करेगा"। ऐसा लगता है कि जॉकी की वसा बहुत तेज है, तो तेज घोड़ा प्राप्त करें। चिप विक्रेताओं पर कड़ी मेहनत करने वाले इंजीनियरों ने हमें कभी भी तेज हार्डवेयर देने के लिए अद्भुत काम किया है। मुझे आश्चर्य है कि क्या वे जानते हैं कि प्रोग्रामर उस पर भरोसा कर रहे हैं, बजाय उनके कोड से वसा प्राप्त करने के बजाय? –

1

मुझे पसंद नहीं है कि क्या हैकर सुझाव दे रहा है। सबसे पहले मैं देखता हूं कि क्या मैं वेबसर्वर छोड़ सकता हूं। यदि ऐसा है तो एक अच्छा विकल्प nginx या lighttpd है। अपाचे की तुलना में वे इस शताब्दी से हैं और कॉन्फ़िगरेशन भी बहुत आसान है।ऑटोलोडिंग के बारे में मुझे वास्तव में पता नहीं है, लेकिन यदि क्लास फाइलें वास्तव में बड़ी हैं तो आपने राम डिस्क स्थापित करने या PHP कंप्रेसर का उपयोग करने का प्रयास किया था? मेरे अनुभव में एक PHP कंप्रेसर निष्पादन समय को काफी तेज़ कर सकता है (यानी पार्सिंग समय)।

3

मैं Webgrind Xdebug & का उपयोग कर प्रदर्शन का अनुकूलन करने

ठीक है, के बाद से आप को गंभीरता से बेहतर प्रदर्शन की आवश्यकता होगी, की एक स्थिति में हैं कोशिश कर रहा हूँ, आप लोकप्रिय तुलना में एक कम के लिए खुला हो सकता है, लेकिन प्रमाण्य प्रभावी, इसे करने का तरीका।

यह किसी भी भाषा के साथ काम करता है, जब तक कि एक डीबगर होता है जिसे रोक दिया जा सकता है, जैसे Xdebug।

यहां यह in a nutshell वर्णित है। Here's one demonstration of its effectiveness. मैं आपको कई और लिंक कर सकता हूं।

आपको इसे थोड़ा बौद्धिक रूप से रिंचिंग मिल सकता है।

  1. आपको दिनचर्या से जुड़े समय के रूप में "बाधाएं" मिल रही हैं। सबसे मूल्यवान गति अवसर अक्सर उस तरह प्रकट नहीं होते हैं। वे गतिविधियां हैं जिन्हें आप आसानी से वर्णन कर सकते हैं जब आप उन्हें देखते हैं, लेकिन वे फैल गए हैं। वे किसी विशेष दिनचर्या या कोड की रेखा में महत्वपूर्ण समय पर ध्यान केंद्रित नहीं करते हैं, इसलिए प्रोफाइलर उन्हें नहीं देखते हैं।

  2. सबसे बड़ा स्पीडअप अवसर ठीक करने के लिए बिल्कुल आसान नहीं हो सकता है। उन्हें फिर से विचार करने की आवश्यकता हो सकती है कि कार्यक्रम कैसे व्यवस्थित किया जाता है। अगर आपको ऐसा कुछ मिलता है जिसे आप आसानी से ठीक कर सकते हैं, तो यह बहुत अच्छा है। आगे बढ़ें और इसे कर डालें। यदि यह इतना आसानी से तय नहीं किया गया है, लेकिन फिर भी आपको बहुत समय बचाएगा, अगर आपको उस समय को बचाने की ज़रूरत है, तो आपको इसे करना होगा या नहीं।

शुभकामनाएं।

0

मुझे बहुत अधिक अनुभव नहीं है लेकिन एक बार मुझे ऐसी समस्या हो गई है। मैंने अपने शामिल पथों की जांच की है और अधिकतम उपयोग किए गए लाइब्रेरी पथों के क्रम में उनका सहारा लिया है। और मुझे लगभग 30% बढ़ावा मिला है। मुझे लगता है कि यह आपके द्वारा पहले से ही ज्ञात है लेकिन किसी भी तरह से पोस्ट किया गया है ....... :)

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