2010-07-21 9 views
9

newInstance() का उपयोग मेरे कोड के प्रदर्शन-महत्वपूर्ण क्षेत्र में newInstance() का उपयोग कर नए ऑपरेटर बनाम नए ऑपरेटर() के प्रदर्शन के रूप में किया गया था। विधि हस्ताक्षर है:जावा में

<T extends SomethingElse> T create(Class<T> clasz)

मैं पारित Something.class तर्क के रूप में, मैं newInstance() के साथ बनाया SomethingElse का एक उदाहरण, मिलता है।

आज मैं सूची से इस प्रदर्शन TODO को साफ़ करने के लिए वापस आया, इसलिए मैंने new ऑपरेटर बनाम newInstance() के कुछ परीक्षण चलाए। मैं newInstance() के प्रदर्शन दंड के साथ बहुत हैरान था।

मैं यहाँ इसके बारे में थोड़ा लिखा है,: http://biasedbit.com/new-vs-newinstance/

(। आत्म पदोन्नति के बारे में क्षमा करें ... मैं पाठ यहाँ जगह चाहते हैं, लेकिन इस सवाल का अनुपात के बाहर विकसित होगा)

क्या मुझे यह जानना अच्छा लगेगा कि -server झंडा इस तरह के प्रदर्शन को बढ़ावा देता है जब वस्तुओं की संख्या बड़े पैमाने पर बढ़ती है और "कम" मानों के लिए नहीं, 100 या 1000 के लिए नहीं।

मैंने अपना सबक सीख लिया पूरी प्रतिबिंब चीज, यह जेवीएम रनटाइम में निष्पादन के अनुकूलन के बारे में सिर्फ जिज्ञासा है, espec § -server ध्वज के साथ। इसके अलावा, अगर मैं परीक्षण में कुछ गलत कर रहा हूं, तो मैं आपकी प्रतिक्रिया की सराहना करता हूं!


संपादित करें: मैंने एक गर्मजोशी चरण जोड़ा है और परिणाम अब और अधिक स्थिर हैं। इनपुट के लिए धन्यवाद!

+0

लिंक टूटा हुआ है:/ –

+0

वहां मैंने इसे ठीक कर दिया! – biasedbit

+0

ब्लॉग पोस्ट [फिर से स्थानांतरित हो गया है] (http://biasedbit.com/blog/new-vs-newinstance)। –

उत्तर

5

मैंने पूरे प्रतिबिंब की बात के साथ अपना सबक सीखा है, यह जेवीएम रनटाइम में निष्पादन के बारे में सिर्फ जिज्ञासा है, खासकर -सर्वर ध्वज के साथ। इसके अलावा, अगर मैं परीक्षण में कुछ गलत कर रहा हूं, तो मैं आपकी प्रतिक्रिया की सराहना करता हूं!

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

मुझे लगता है कि "-सेवर" एक अंतर बना रहा है कि (अन्य चीजों के साथ) यह नियमों को बदलता है जो निर्धारित करते हैं कि जेआईटी संकलन कब किया जाए। धारणा यह है कि "सर्वर" के लिए यह जल्द ही जेआईटी के लिए बेहतर है, इससे धीमी स्टार्टअप लेकिन बेहतर थ्रूपुट मिलता है। (इसके विपरीत एक "क्लाइंट" को जेआईटी संकलन को रोकने के लिए ट्यून किया गया है ताकि उपयोगकर्ता को जल्द ही एक कामकाजी जीयूआई मिल जाए।)

+0

मैंने वास्तविक परीक्षण चलाने से पहले कुछ गर्मजोशी पुनरावृत्तियों को जोड़ा है और मैं बेहतर, अधिक स्थिर आंकड़े प्राप्त कर रहा हूं। -सर्वर ध्वज के साथ, नया प्रवेश() नए से 2.5 ~ 2.9 गुना धीमा हो जाता है (100 के लिए और 1kk वस्तुओं के लिए)। -सर्वर के बिना यह 100 ऑब्जेक्ट्स के लिए धीमी गति से 8 ~ 9 गुना जितना धीमा हो जाता है, तक 1kk तक 25 धीमी हो जाती है)। महान सलाह! :) – biasedbit

+0

JVM को ठीक से गर्म करने का एक बेहतर तरीका है, इसे -XX: + PrintCompilation कमांड लाइन तर्कों को पारित करना है जो जेवीएम को सभी जेआईटी संकलन और ऑप्टिमाइज़ेशन को प्रिंट करता है जैसा कि यह करता है। फिर सुनिश्चित करें कि आपके समयबद्ध दौड़ के दौरान संकलन चरणों में से कोई भी नहीं होता है। – LordOfThePigs

+0

@LordOfThePigs - मैं असहमत हूं। आम तौर पर, सबसे अच्छा तरीका बड़ी संख्या में (वैकल्पिक) पुनरावृत्तियों को चलाने, समय रिकॉर्ड करने, और शुरुआती लोगों को त्यागना है। फिर औसत। यह समस्याओं के अन्य स्रोतों के साथ-साथ जेआईटीइंग का ख्याल रखता है। '-XX: + प्रिंटकंपिलेशन 'दृष्टिकोण केवल जेआईटी विसंगतियों को संबोधित करता है। –

1

अन्य चीजों के अलावा, -server विकल्प के लिए कचरा संग्रहण प्रोफ़ाइल survivor space sizing डिफ़ॉल्ट रूप से भिन्न है।

नज़दीक पढ़ने पर, मुझे लगता है कि आपका उदाहरण micro-benchmark है और परिणाम काउंटर-अंतर्ज्ञानी हो सकते हैं। उदाहरण के लिए, मेरे प्लेटफ़ॉर्म पर, newInstance() पर बार-बार कॉल प्रभावी ढंग से दोहराए गए रनों के दौरान अनुकूलित हो जाते हैं, newInstance()new से 12.5 गुना तेज दिखाई देते हैं।

+0

मैं -XX: + PrintGCDetails के साथ भाग गया और मैंने केवल 1 संग्रह देखा - पूरा संग्रह मैंने दोनों परीक्षणों के बीच मजबूर किया। मैंने ऐप को पर्याप्त मेमोरी प्रदान करने के लिए सुनिश्चित किया है कि इसे आकार बदलने या एकत्र करने की आवश्यकता नहीं होगी (वास्तव में मैं उसी -Xmx के रूप में -XMS का उपयोग करके आकार बदलने का भी रोक रहा था)। इन शर्तों के तहत, मेरा मानना ​​है कि जीसी परिणाम में निर्णायक कारक नहीं था। – biasedbit

+0

@brunodecarvalho: हाँ, मैं देखता हूं कि आपका क्या मतलब है, और मैंने ऊपर विस्तार किया है। सार्थक परिणाम प्राप्त करने के लिए आपको अपने बेंचमार्क को फिर से लिखना होगा। – trashgod

+0

हाँ, मैं यहां माइक्रो-बेंचमार्क प्रभाव से डरता था। मैं आशा करता हूं कि उस ऑब्जेक्ट सरणी में केवल नया उदाहरण जोड़ रहा है कि संकलक को यह पता नहीं चलेगा कि यह एक व्यर्थ ऑपरेशन है और पूरे लूप को पूरी तरह से हटा देता है। मैं इस प्रणाली का उपयोग करके फिर से परीक्षण करूँगा जिसे मैं अनुकूलित करने वाला था। हालांकि, मुझे थोड़ा विचित्र लगता है कि नया इंस्टेंस() नया से तेज़ हो जाता है। जेडीके के स्रोत के माध्यम से देखते हुए, ऐसा लगता है कि नया ओवरहेडेंस() चला जाता है और नया नहीं होता है। – biasedbit

1

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

+0

आपकी स्पष्टीकरण समझ में आता है, क्योंकि मैंने कोड को देखा है और समझा है कि पूरी सुरक्षा तंत्र एक महत्वपूर्ण ओवरहेड जोड़ देगा। हालांकि, -बैच ध्वज वैध प्रतीत नहीं होता है। – biasedbit

+0

@brunodecarvalho: आप सही हैं! सिंटैक्स है- जैसा कि मैंने टाइप किया है, एक्सचैच बैच नहीं है। विवरण के लिए: http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/tooldocs/windows/java.html और http : //download.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/tools/windows/java.html –

+0

बहुत अंतर नहीं लग रहा था। मैंने यह देखने के लिए वार्मअप चरण हटा दिया कि क्या यह परिणाम प्रभावित करेगा, लेकिन मुझे -Xbatch और बिना के साथ बहुत अधिक मूल्य मिल रहा है। फिर भी, यह एक बहुत ही दिलचस्प झंडा है! – biasedbit

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