2012-01-20 24 views
6

जावा संकलक की तरह साधारण दोहराया गणित संचालन का अनुकूलन होगा:क्या संकलक दोहराए गए गणित कंप्यूटेशंस को अनुकूलित करेगा?

if (prevX/width != curX/width) { 
    // Do something with prevX/width value 
} else { 
    // Do something with curX/width value 
} 

मैं जानता हूँ कि मैं बस से पहले एक चर के परिणाम प्रदान कर सकते हैं अगर बयान और वैरिएबल लौटने के लिए, लेकिन यह एक तरह से बोझिल है। यदि संकलक स्वचालित रूप से पहचानता है कि वही गणनाएं की जा रही हैं और परिणामों को अस्थायी चर के लिए कैश कर रही हैं, तो मैं उपर्युक्त सम्मेलन में रहूंगा।

* संपादित करें - मैं मूर्ख हूं। मैंने अपने प्रश्न को बहुत सरल/अमूर्त करने की कोशिश की। यह इतना आसान नहीं है: यदि (x> y)

+1

जब तक कि चौड़ाई नकारात्मक न हो, क्या आप अभी 'if (x> y) नहीं जा सकते ...' – user949300

+1

क्यों नहीं 'Math.max (x/width, y/width) '? इसके अलावा @ उपयोगकर्ता 9 4 9 300: यदि ये स्याही हैं, तो यह एक अलग परिणाम दे सकता है। –

+0

@ एरिक एंड्रेस मुझे नहीं लगता कि चींटियों को मूल समस्या में कोई फर्क नहीं पड़ता है, क्योंकि यह केवल 2 तरह की जांच थी (यह समानता की जांच नहीं करता था) यदि (x> y), तो x/width का कोई तरीका नहीं है 0. लेकिन इनट्स नए प्रश्न में बहुत मायने रखेंगे, इसलिए आपको +1 करें। – user949300

उत्तर

7

उत्तर हाँ है। यह Common Subexpression Elimination कहा जाता है और एक मानक (और शक्तिशाली) संकलक जावा, C/C++ और दूसरों में प्रयोग किया जाता है अनुकूलन है ...

This page पुष्टि करता है कि हॉटस्पॉट JVM इस अनुकूलन कर सकते हैं।


जिसके अनुसार, या नहीं, संकलक/रन-टाइम जब आप उम्मीद कर यह एक और कहानी है करने के लिए इस अनुकूलन करने के लिए सक्षम हो जाएगा। तो मैं आमतौर पर इन अनुकूलन को स्वयं करना पसंद करता हूं अगर यह पठनीयता भी बढ़ाता है।

double xw = x/width; 
double yw = y/width; 

if (xw > yw) { 
    return xw; 
} else { 
    return yw; 
} 
+1

+1: 'javac' कंपाइलर कोई अनुकूलन के बगल में नहीं है, हालांकि जेआईटी मूल संकलक यह मानने की अत्यधिक संभावना है कि यह कोड को संकलित करता है (अधिकांश कोड देशी को संकलित नहीं किया जाता है क्योंकि यह पर्याप्त नहीं है) विस्तृत उत्तर के लिए –

2

सामान्य रूप से, "हाँ" - संकलक कोड को अनुकूलित कर देगा यदि यह कर सकता है, और हॉटस्पॉट JVM बार-बार निष्पादित कोड ब्लॉक भी सुधार सकता है।

इस मामले में हालांकि, आप बेहतर हो इस तरह कोड refactor करने के लिए होगा:

if (x > y) 
    return x/width; 
return y/width; 

जो एक प्रभाग संचालन करता है, तो x > y बचा जाता है।

+0

मैं बस जोड़ना चाहता हूं कि संकलक अनुकूलन और अन्य अनियंत्रित सुविधाओं पर भरोसा करना एक अच्छा प्रोग्रामिंग अभ्यास नहीं है। चाहे परिणाम समान हों या नहीं, कुशल कोड लिखना हमेशा कोड की गुणवत्ता को बढ़ाता है। – buc

+0

@buc ​​आपके द्वारा लिखे गए कोड का 99% प्रदर्शन संवेदनशील नहीं है और अक्सर सबसे कुशल कोड सबसे अधिक रखरखाव कोड नहीं है। विशेष रूप से कितने अच्छे कंपाइलर्स इन दिनों चिंता करते हैं कि वे एक साधारण गणित समारोह पर सीएसई करेंगे जैसे कि यह बेकार है। बस स्पष्ट कोड लिखें .. – Voo

3

संकलक इस तरह के अनुकूलन प्रदर्शन कर सकते हैं। यह वास्तव में पड़ता कि निम्नलिखित के जवाब पर निर्भर करता है:

संकलक अनुमति JLS द्वारा ऐसा करने के लिए है?

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

क्या यह संकलक सक्षम है?

एक कंपाइलर को सामान्य उप-अभिव्यक्तियों का पता लगाने के लिए कोड का विश्लेषण करने की आवश्यकता होती है जो कानूनी रूप से अनुकूलित हो सकती है। यहां दो मुद्दे हैं:

  • क्या आवश्यक तर्क करने में सक्षम संकलक है? उदाहरण के लिए, कोई एक कंपाइलर परिकल्पना कर सकता है जो यह निर्धारित कर सकता है कि एक विशिष्ट विधि कॉल साइड-इफेक्ट मुक्त होगा और इसलिए इसे अनुकूलित किया जा सकता है। हालांकि, एक कंपाइलर बनाना जो वास्तव में ऐसा करने में सक्षम है ...और दिलचस्प समस्या है।

  • अनुकूलन अनुकूल है? अनुकूलन और लाभ करने की लागत के बीच एक व्यापार-बंद है। यह एक सीधा आगे व्यापार बंद नहीं है। इसे देखने की लागत को ध्यान में रखना चाहिए कि क्या ऑप्टिमाइज़ेशन किया जा सकता है ... जब यह वास्तव में नहीं हो सकता है। दूसरे शब्दों में, संकलन समय पर प्रभाव। (भालू और मन है कि जावा में अनुकूलन ज्यादातर JIT कम्पाइलर ... इसलिए आवेदन प्रदर्शन पर इस प्रभाव से कार्यावधि में किया जाता है।)

आपके जैसे एक साधारण उदाहरण में, अनुकूलन के कानूनी (सापेक्ष volatile है) और किसी को इसे करने के लिए आधे सभ्य जेआईटी कंपाइलर की अपेक्षा करनी चाहिए।


अन्य सवाल यह है कि आप स्पष्ट रूप से अपने कोड आम भाव का मूल्यांकन करने और temporaries लिए परिणाम बताए द्वारा संकलक मदद करने के लिए प्रयास करना चाहिए है।

आईएमओ, उत्तर आम तौर पर नहीं है।

  • एक अच्छा कंपाइलर शायद आपके जैसा काम करेगा। और यदि ऐसा नहीं होता है, तो अगली पीढ़ी कर सकती है।

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

  • एक मौका है कि आप इसे पूरा करेंगे; जैसे को भूलकर कि एक विधि कॉल का एक महत्वपूर्ण दुष्प्रभाव होता है या एक चर के लिए एक चर volatile है।

दूसरी ओर, अगर फिर से लिखने के अपने कोड अधिक पठनीय बनाता है, कि यह करने के लिए एक अच्छा कारण नहीं है।

+0

+1। – Mysticial

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