जब एक विधि एक शुद्ध कार्य है, तो यह पता लगाने के लिए पर्याप्त जेकाक जैसे कंपाइलर हैं।
यह "स्मार्ट पर्याप्त" का सवाल नहीं है। इसे शुद्धता विश्लेषण कहा जाता है और सामान्य मामले में यह काफी असंभव है: यह हॉल्टिंग समस्या को हल करने के बराबर है।
अब, निश्चित रूप से, ऑप्टिमाइज़र हर समय असंभव चीजें करते हैं, "सामान्य मामले में काफी असंभव" इसका मतलब यह नहीं है कि यह कभी भी काम नहीं करता है, इसका मतलब केवल यह है कि यह सभी मामलों में काम नहीं कर सकता है। तो, वास्तव में एल्गोरिदम यह जांचने के लिए हैं कि कोई फ़ंक्शन शुद्ध है या नहीं, यह सिर्फ इतना है कि परिणाम से अधिक बार "मुझे नहीं पता" होगा, जिसका अर्थ है कि सुरक्षा और शुद्धता के कारणों के लिए, आपको यह मानने की आवश्यकता है यह विशेष कार्य अशुद्ध हो सकता है।
और यहां तक कि उन मामलों में जहां यह काम करता है , एल्गोरिदम जटिल और महंगे हैं।
तो, यह समस्या # 1 है: यह केवल विशेष मामलों के लिए काम करती है ।
समस्या # 2: पुस्तकालय । किसी फ़ंक्शन के शुद्ध होने के लिए, इसे केवल शुद्ध फ़ंक्शन कहा जा सकता है (और वे फ़ंक्शन केवल शुद्ध कार्यों को कॉल कर सकते हैं, और इसी तरह आगे भी)। Javac स्पष्ट रूप से केवल जावा के बारे में जानता है, और यह केवल उस कोड के बारे में जानता है जिसे वह देख सकता है। इसलिए, यदि आपका फ़ंक्शन किसी अन्य संकलन इकाई में फ़ंक्शन को कॉल करता है, तो आप यह नहीं जान सकते कि यह शुद्ध है या नहीं। यदि यह किसी अन्य भाषा में लिखे गए फ़ंक्शन को कॉल करता है, तो आप नहीं जान सकते। यदि यह एक पुस्तकालय में एक समारोह कहता है जो अभी तक स्थापित नहीं हो सकता है, तो आप नहीं जान सकते। और इसी तरह।
यह केवल तभी काम करता है, जब आपके पास पूरे कार्यक्रम का विश्लेषण होता है, जब पूरा कार्यक्रम एक ही भाषा में लिखा जाता है, और सभी को एक बार में एक साथ संकलित किया जाता है। आप किसी भी लाइब्रेरी का उपयोग नहीं कर सकते।
समस्या # 3: निर्धारण । एक बार जब आपको पता चल गया कि कौन से हिस्से शुद्ध हैं, तो आपको अभी भी उन्हें अलग-अलग थ्रेड्स के लिए शेड्यूल करना होगा। या नहीं। धागे शुरू करना और रोकना बहुत महंगा है (विशेष रूप से जावा में)। यहां तक कि अगर आप एक थ्रेड पूल रखते हैं और उन्हें शुरू या बंद नहीं करते हैं, तो थ्रेड संदर्भ स्विचिंग भी महंगा है। आपको यह सुनिश्चित करने की आवश्यकता है कि अभिकलन समय से काफी समय तक चलेगा जब इसे शेड्यूल करने और संदर्भ स्विच करने में समय लगेगा, अन्यथा आप प्रदर्शन खो देंगे , इसे हासिल नहीं करेंगे।
जैसा कि आप शायद अब तक अनुमान लगा चुके हैं, यह पता लगाना कि सामान्य स्थिति में एक संगणना कितनी देर तक असंभव है (हम यह भी पता नहीं लगा सकते हैं कि क्या यह एक परिमित राशि लेगा, अकेले कितना समय दें) और कठिन और महंगा भी विशेष मामला।
इसके अलावा: Javac और अनुकूलन । ध्यान दें कि javac के अधिकांश कार्यान्वयन वास्तव में कई अनुकूलन नहीं करते हैं। उदाहरण के लिए, ओरेकल के जेवैक का कार्यान्वयन, अनुकूलन करने के लिए अंतर्निहित निष्पादन इंजन पर निर्भर करता है । इससे समस्याओं का एक और सेट होता है: कहते हैं, जेवैक ने फैसला किया कि एक विशेष फ़ंक्शन शुद्ध है और यह काफी महंगा है, और इसलिए यह इसे एक अलग धागे पर निष्पादित करने के लिए संकलित करता है। फिर, प्लेटफ़ॉर्म का ऑप्टिमाइज़र (उदाहरण के लिए, हॉटस्पॉट C2 JIT कंपाइलर) साथ आता है और पूरे फ़ंक्शन को दूर करता है। अब, आपके पास एक खाली धागा है जो कुछ भी नहीं कर रहा है। या, कल्पना करें, फिर से, javac एक अलग धागे पर एक फ़ंक्शन शेड्यूल करने का फैसला करता है, और प्लेटफॉर्म ऑप्टिमाइज़र सकता है इसे पूरी तरह से हटा दें, सिवाय इसके कि यह थ्रेड सीमाओं के पार इनलाइनिंग नहीं कर सकता है, और इसलिए एक फ़ंक्शन जिसे पूरी तरह से ऑप्टिमाइज़ किया जा सकता है, उसे अब निष्पादित किया जाना चाहिए।
इसलिए, ऐसा कुछ करना वास्तव में केवल तभी समझ में आता है जब आपके पास एक एकल कंपाइलर एक ही बार में अधिकांश अनुकूलन कर रहा हो, ताकि कंपाइलर के बारे में पता चले और विभिन्न स्तरों पर सभी अलग-अलग अनुकूलन और एक-दूसरे के साथ उनकी बातचीत का फायदा उठा सके।
ध्यान दें कि, उदाहरण के लिए, हॉटस्पॉट सी 2 JIT कम्पाइलर वास्तव में करता है कुछ ऑटो vectorization, जो भी ऑटो चलाना का एक रूप है प्रदर्शन करते हैं।