2013-04-03 6 views
5

मेरे पास वर्तमान में एक कमांड लाइन उपकरण है जो गुइस और उसके एक्सटेंशन का काफी उपयोग करता है।सामान्य उपहार प्रदर्शन दिशानिर्देश

उपकरण की कार्यक्षमता को पूरा करने के बाद, मैंने यह निर्धारित किया है कि प्रदर्शन उप-मानक है, और सरल hprof का उपयोग करके प्रोफाइलिंग शुरू कर दिया है।

यह इंगित करता है कि केवल इंजेक्टर बनाना एक महत्वपूर्ण प्रदर्शन समस्या है। मैं आमतौर पर मॉड्यूल में किसी भी वास्तविक काम से बचने और प्रदाताओं के लिए रिजर्व गणना गहन काम से बचने के लिए ...

इसके साथ, गुइस के लिए कुछ सामान्य प्रदर्शन दिशानिर्देश क्या हैं? क्या मुझे @AssistedInject और FactoryModuleBilders का उपयोग करने से बचना चाहिए? यदि संभव हो तो @ सिंंगलेट से बचें? सुनिश्चित करें कि सभी बाइंडिंग स्पष्ट हैं और जेआईटी बाइंडिंग से बचें?

मैंने पूरी तरह से खोज की है, लेकिन वास्तव में यह कहने वाले लोगों के अलावा मूल गिस प्रदर्शन को अधिक संबोधित नहीं कर सकता है।

+1

खैर, मॉड्यूल का मूल्यांकन केवल एक बार किया जाता है, लेकिन प्रदाता कई बार मूल्यांकन करते हैं। इसलिए यदि वांछित प्रभाव प्राप्त करने के लिए _any_ तरीका है तो मैं इसे बिल्कुल अन्य तरीके से करूँगा। सिंगलटन भी: उनसे क्यों बचें? उन्हें गले लगाओ। एक बार किया गया काम दो बार किए गए काम से धीमा नहीं हो सकता है। –

+0

यह आवश्यक रूप से प्रश्न का उत्तर नहीं देता है ... प्रोफाइलिंग से मैं देखता हूं कि केवल CreateInjector कॉल मेरे प्रसंस्करण समय का आधा है। – thebamaman

+0

क्या आपकी प्रोफाइलिंग में क्लासलोडिंग, जीसी और जेआईटी के लिए समय शामिल है या बहिष्कृत किया गया है? इसके अलावा: क्या आपने प्रश्न [http://stackoverflow.com/questions/4748405/how-to-improve-guice-performance-at-startup] जांच लिया था? –

उत्तर

3

सबसे पहले, आपका प्रश्न वांछित होने के लिए बहुत कुछ छोड़ देता है। "उप-मानक" प्रदर्शन क्या है और आपने इसका क्या निर्णय लिया है इसका क्या अर्थ है? यह मनमाना है? क्या आपके पास ऐसा उपयोगकर्ता है जो सोचता है कि यह बहुत धीमा है? क्या उपयोगकर्ता बातचीत से परिणाम उत्पन्न करने में बहुत लंबा समय लगता है या बहुत लंबा लगता है?

मूल्यांकन के लिए वास्तविक कोड के बिना, प्रदर्शन समस्याओं को डीबग करना मुश्किल है। यहां मेरे अनुभव से कुछ सुझाव दिए गए हैं:

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

  2. सिंगलेटन प्रदर्शन के लिए बहुत अच्छा हो सकता है, बस इसका दुरुपयोग न करें। वे केवल एक बार बनाए जाते हैं, जैसे ही आप अपना इंजेक्टर (उत्सुक सिंगलेट) बनाते हैं या ऑब्जेक्ट ग्राफ़ में किसी अन्य चीज़ द्वारा पहली बार अनुरोध किया जाता है।

  3. समझें कि गिइस एक प्रतिबिंब आधारित पुस्तकालय है और प्रतिबिंब हमेशा धीमा है। जब आप इंजेक्टर बनाते हैं तो बहुत प्रतिबिंब की कीमत पर, गुइस रनटाइम पर बहुत तेजी से होने का उत्कृष्ट काम करता है (आइटम 1 देखें)। यदि आप अपने आवेदन में ध्यान देने योग्य अंतराल देख रहे हैं, तो शायद इसका मतलब है कि आप कुछ गलत कर रहे हैं।

अंत में, यदि आप तय करते हैं कि आप बस Guice का प्रदर्शन "मुद्दों" नहीं संभाल कर सकते हैं, तो आप बाहर Square (संस्करण 1) और Google (संस्करण 2) से डैगर की तरह एक वैकल्पिक कोशिश कर सकते। यह प्रतिबिंब के बजाय कोड जनरेशन का उपयोग करता है, इसलिए आपके पास प्रतिबिंब लागत नहीं है, लेकिन यह पूर्ण विशेषताओं के रूप में नहीं है और इसमें एक्सटेंशन नहीं हैं।

+0

... महान सारांश। बस सोचा कि मैं एक छोटे से बिंदु को स्पष्ट करता हूं - डैगर 1 वास्तव में प्रतिबिंब का उपयोग करता है, जबकि डैगर 2 नहीं करता है। – hsl

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