2012-01-05 11 views
7

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

मेरा प्रश्न (ओं):

  1. क्या संकलक को यह FREEDM अनुमति देकर हासिल की है? क्या संकलक के लिए कोड वास्तव में संभव है जो कोड को पुन: व्यवस्थित करके अधिक कुशल है? मुझे अभी तक एक व्यावहारिक मामला नहीं दिख रहा है। मुझे कभी-कभी लगता है कि लाभ अगर किसी भी तरह के समेकन जोखिम से अधिक है, तो इससे लाभ हो सकता है।

  2. क्या कोई तरीका है कि प्रोग्रामर संकलक को बता सकता है कि इस तरह की रेखाओं को पुनर्व्यवस्थित न करें? मुझे पता है कि सिंक्रनाइज़ेशन प्राइमेटिव का उपयोग करके पुन: व्यवस्थित करने के दुष्प्रभावों को प्रभावी ढंग से संभालता है, लेकिन मैं यह पूछ रहा हूं कि इसे बंद करने के लिए कोई प्रत्यक्ष तरीका (कंपाइलर विकल्प) है या नहीं?

उत्तर

8

javac संकलक प्रदर्शन में कोई अनुकूलन करने के लिए अगले।

जेआईटी मूल संकलक निर्देशों को दोबारा आदेश दे सकता है जहां स्मृति क्रम समस्या है। हालांकि, सीपीयू भी निर्देशों और स्मृति अद्यतनों को फिर से ऑर्डर कर सकता है जिसका एक ही प्रभाव है।

इस स्वतंत्रता को संकलक को अनुमति देकर क्या हासिल किया जाता है?

मुख्य लाभ कोड पोर्टेबिलिटी है। आपके द्वारा प्रदान की जाने वाली अधिक गारंटी, यह सुनिश्चित करना अधिक कठिन है कि प्रत्येक मंच वास्तव में ऐसा करता है।

सीपीयू को निर्देशों को निष्पादित करने की अनुमति देकर एक महत्वपूर्ण प्रदर्शन सुधार भी होता है जब यह सख्त क्रम में हो सकता है।

क्या संकलक के लिए कोड वास्तव में कोड को पुन: व्यवस्थित करना अधिक कुशल है?

हां। लेकिन सीपीयू द्वारा किया गया पुन: क्रम अधिक महत्वपूर्ण है।

मुझे अभी तक इसके लिए एक व्यावहारिक मामला नहीं दिख रहा है। मुझे कभी-कभी लगता है कि लाभ अगर किसी भी तरह के समेकन जोखिम से अधिक है, तो इससे लाभ हो सकता है।

क्या कोई तरीका है कि प्रोग्रामर संकलक को बता सकता है कि इस तरह की रेखाओं को पुनर्व्यवस्थित न करें?

यही कारण है कि आप volatile, synchronized ब्लॉक और Lock तरह स्मृति बाधाओं का उपयोग करें।जब आप इनका उपयोग करते हैं तो आपको थ्रेड सुरक्षा गारंटी मिलती है।

मुझे पता है कि तुल्यकालन पुरातन का उपयोग कर प्रभावी ढंग से उलटफेर का दुष्प्रभाव संभालती है, लेकिन अगर कोई सीधा रास्ता (संकलक विकल्प) इस बंद करने के लिए है मैं पूछ रहा हूँ?

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

अद्यतनों के पुन: क्रम से बचने के लिए थ्रेड सुरक्षा समस्या का इतना छोटा हिस्सा है (इसका सबसे बड़ा मुद्दा यह है कि यह अस्पष्ट है और शायद ही कभी ऐसा होता है जो इसे कठिन बनाता है) और एक बार जब आप थ्रेड सुरक्षित कोड लिखते हैं, तो यह कम हो जाता है।

2

बाइटकोड को पुन: व्यवस्थित करने की प्रक्रिया जेआईटी (जस्ट इन टाइम कंपाइलर) द्वारा प्रबंधित की जाती है। आप इसे निम्न विकल्प के साथ चलने से रोक सकते हैं:

-Djava.compiler=NONE 

यहाँ अधिक देखें: http://www.cs.swarthmore.edu/~newhall/unixhelp/debuggingtips_Java.html

+1

यह सीपीयू पुन: आदेश निर्देशों को नहीं रोकेगा। ;) –

+0

और यह आपके प्रोग्राम को वास्तव में धीमा कर देता है, इसलिए यह कोई विकल्प नहीं है जो किसी भी उत्पादन के उपयोग के लिए उपयोगी है। – Jesper

2

क्या संकलक के लिए कोड वास्तव में कोड को पुन: व्यवस्थित करना अधिक कुशल है?

ओह हाँ यह है!

आधुनिक कंप्यूटर आर्किटेक्चर में जीवन के तथ्यों में से एक यह है कि स्मृति मुख्य प्रदर्शन बाधा है। सीपीयू मुख्य स्मृति से पढ़ने और लिखने के मुकाबले कई बार तेज़ी से निर्देश पंजीकृत करने के लिए रजिस्टर कर सकता है। यही कारण है कि उच्च प्रदर्शन चिप्स में स्मृति कैश के 2 या 3 स्तर होते हैं। इसके अलावा, विशिष्ट सीपीयू पाइपलाइनिंग का उपयोग कई निर्देशों को एक ही समय में निष्पादित करने की प्रक्रिया में होने की अनुमति देते हैं।

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

नोट: हम यहां एक महत्वपूर्ण गति के बारे में बात कर रहे हैं: शायद 3 से 5 गुना गति।

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

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