2016-07-22 7 views
7

उदाहरण के लिए (मान लें कि हम सी ++ के बारे में बात कर रहे हैं यदि यह एक भिन्न बनाता है), & & ऑपरेटर में यदि मुझे पता है कि एक कथन का परिणाम 0 से अधिक होगा/अधिक संभावना है तो दूसरा कथन मुझे रखना चाहिए बाईं ओर, और दाईं ओर अन्य कथन?क्या छोटा सर्किटिंग प्रोग्राम के निष्पादन को तेज़ी से निष्पादित करता है, और यह विश्लेषण कर रहा है कि कौन सा कथन पहले स्टेटस स्टेटमेंट में डाल सकता है?

उसी के लिए जाता है || ऑपरेटर अगर मुझे पता है कि एक कथन का परिणाम 1 और अधिक होगा/तो मुझे अधिक मौका मिलेगा, तो दूसरे कथन को मैंने बाईं ओर रखा होगा, और दाईं ओर अन्य कथन?

अब यह सब करने से कार्यक्रम का विश्लेषण करने में काफी समय लगेगा, लेकिन यदि यह प्रोग्राम के लिए निष्पादन समय को तेज करता है तो यह करने के लायक है, और यह ऐसा कुछ है जो एम्बेडेड/रीयल-टाइम सिस्टम प्रोग्रामर इन्हें देखता है यदि आवश्यक हो तो अपने आवेदन को तेज करना?

+4

* इसके लायक कर यह * कारकों में से एक बहुत कुछ इस पर निर्भर करने के लिए जा रहा है। सबसे बड़ी बात यह है कि इस ट्यूनिंग को करने के लिए कितना खर्च होता है और आप अतिरिक्त प्रदर्शन से कितना बचत करते हैं। सिद्धांत रूप में – NathanOliver

+0

हाँ, कारण shortcircuit ऑपरेटरों मौजूद – user463035818

+0

इस अंतर्निहित अनुप्रयोगों (हार्ड समय सीमा है) में प्रदर्शन में सुधार करने के लिए एक आखिरी प्रयास की तरह है thats, या यह कुछ वे वास्तव में प्रदर्शन में सुधार करने में लग रहे हो रहा है? –

उत्तर

4

सबसे पहले, आप समय से पहले अनुकूलन का शिकार नहीं कर रहे हैं सुनिश्चित करें ।

इसके साथ, यह सुनिश्चित करें कि आपने अपने प्रोग्राम के बाधा को तेज़ करने के लिए जो कुछ भी किया है, सुनिश्चित करें।


करने से आपको कम सर्किटिंग कुछ मामलों में एक अच्छा विचार हो सकता है के बारे में क्या कहा, लेकिन वह है भारी अपने सभी बयानों निर्भर करता है।

उदाहरण के लिए, आप की तरह कुछ पूछना चाहते हैं तो:

if(slowFunction() && complexConditionRootsAndExponents && ConditionUsuallyZero) 

तो आप, कि पिछले शब्द पहली बार होने के लिए शायद चाहेगा आप नहीं है?

हालांकि, सावधान रहें, लॉजिकल अनुक्रम में अनुमति देने के लिए चीजें हमेशा तुच्छ नहीं होती हैं। उदाहरण के लिए Why this program printed fork 4 times? में मेरा उत्तर देखें, जहां कोई देख सकता है कि शॉर्ट सर्किट प्रोग्राम के निष्पादन के प्रवाह को प्रभावित कर सकता है।


टी एल; डॉ

सामान्य में हालांकि, यह परिस्थितियों में मामले permuting द्वारा महत्वपूर्ण speedup मिलना दुर्लभ है। अपने कार्यक्रम की बाधा पर ध्यान केंद्रित करें और जितना मुश्किल हो सके उससे निपटें!

+1

उदाहरण और संदर्भ के लिए धन्यवाद। हां, मुझे नहीं पता था कि समयपूर्व अनुकूलन एक चीज थी, हालांकि अब मैं इसे समझता हूं क्योंकि बाधा को पहले हल किया जाना चाहिए! –

+1

आपका स्वागत है @ ओमिड कॉम्पस्की। आपने एक अच्छा सवाल पूछा, मैंने कुछ साल पहले भी पूछा था और मैंने बाधा के बजाए इसे अनुकूलित करने की कोशिश करने के लिए गलती की थी। और इससे कोई फर्क नहीं पड़ता। अनुकूलन हालांकि आपके कार्यक्रम की बाधा निश्चित रूप से अच्छे परिणाम लाएगी! :) सौभाग्य। – gsamaras

3

आपको यह भी विचार करना होगा कि प्रत्येक पक्ष का मूल्यांकन कितना महंगा है। अपने स्रोत का%

if (veryCostlyOftenFalse() && veryCheapRareFalse()) // may be faster other way around 

जब तक 50 से अधिक, अभिव्यक्ति मूल्यांकन और शाखाओं में हैं मैं कहूंगा कि यह अंतिम उपाय के अनुकूलन है, जब आप सब कुछ के साथ खुश हैं।


एम्बेडेड/वास्तविक समय आवेदन प्रोग्रामर इस क्रम में मोटे तौर पर ध्यान केंद्रित:

  1. निश्चित रूप से एल्गोरिथ्म, उचित अंतरिक्ष बनाम गति में व्यापार बंद पाने के।
  2. स्मृति में डेटा संरचनाएं (जितनी बार संभव हो सके कैश को मारना, जब उन एल्गोरिदम द्वारा उपयोग किया जाता है)।
  3. असली डेटा के साथ असली एप्लिकेशन की प्रोफाइलिंग, यह देखने के लिए कि क्या कुछ अप्रत्याशित बाधाएं हैं और उन्हें ठीक करना है।
  4. यदि आप सख्त कहीं एक घड़ी या दो याद कर रहे हैं, और कुछ जटिल if के आसपास है, तो हाँ, यह मदद मिल सकती है ...
+0

मुझे यह बताने के लिए धन्यवाद कि एम्बेडेड/रीयल-टाइम प्रोग्रामर किस पर ध्यान केंद्रित करते हैं। –

4

प्रश्न का उत्तर है: हाँ, यह प्रदर्शन को प्रभावित करता है।

या नहीं, प्रदर्शन लाभ स्थानों है कि सुधार किया जा सकता है और कार्यक्रम को बदलने के कुछ ही आप जवाब दे सकती है पाने की लागत के लायक है।

ज्यादातर मामलों में प्रदर्शन परिवर्तन छोटा होने वाला है, लेकिन यदि कुछ संचालन शामिल हैं, तो यह महत्वपूर्ण हो सकता है।

जानते हैं कि वहाँ भी शुद्धता निहितार्थ हो सकता है हो सकता है

। उदाहरण के लिए if (foo() || bar()) में अगर यह महत्वपूर्ण है कि bar कहा जाता है कभी नहीं है अगर foo रिटर्न सही है, तो यह पुनः आदेश कॉल करने के लिए एक बग होगा।

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

+1

धन्यवाद, यह अड़चन खोजने की तरह लगता है के रूप में ऐसा लगता है लागत सबसे परिदृश्यों में इन मामलों की खोज से अधिक है, इन छोटे चीजों की तलाश में कहीं अधिक महत्वपूर्ण है। –

5

यह निर्भर करता है। तो बयान के रूप में के रूप में सरल है:

if(y == 4 || x == 2) 

और एक्स == 2 की आवृत्ति मान बहुत अधिक है, इसलिए है कि हम जैसे लिख कर निष्पादन शॉर्ट सर्किट हो सकता है:

if(x == 2 || y == 4) 

लेकिन आप देखते हैं कि हमें इससे अधिक लाभ नहीं मिलेगा, क्योंकि कथन बहुत सरल है और इस स्तर पर कोड को अनुकूलित करना इतना योग्य नहीं हो सकता है।

अब पर विचार की तरह एक उदाहरण:

if(y == an_expensive_function() || x == 2) 

यहाँ मान an_expensive_function() बहुत महंगा ऑपरेशन है, यह जटिलता घातीय की तरह है का कहना है कि, निश्चित रूप से यह समझ में आता है की तरह बयान डाल करने के लिए:

if(x == 2 || y == an_expensive_function()) 
लघु सर्किट करने के लिए

एंबेडेड और एप्लिकेशन डेवलपर्स या किसी भी डेवलपर को पहले उदाहरण पर ऐसी अच्छी ग्रैनुलाइटी पर ऑप्टिमाइज़ करने पर विचार नहीं किया जा सकता है अगर यह उन्हें अधिक लाभ नहीं दे रहा है। अगर वे चीजें ठीक काम कर रही हैं तो वे इसे भी नहीं मान सकते हैं। तो एक डेवलपर के रूप में हमें यह जांचने की आवश्यकता है कि इस स्तर पर कोड का विश्लेषण और अनुकूलन करने में कितना समय लगेगा और इससे हमें कितना लाभ मिलता है।

+0

स्पष्टीकरण के लिए धन्यवाद, और समझने के लिए महान उदाहरण! और स्पष्ट रूप से हर कोई कह रहा है कि कोई भी इस चरम पर कोड को ठीक से ट्यून नहीं करता है और इस तरह के विवरण में आने से पहले बाधा को हल करना महत्वपूर्ण है। –

3

निश्चित रूप से।अपने सशर्त फार्म की है अगर:

if (x() && y()) ... 

और y गणना करने के लिए महंगा है, और एक्स सस्ता है और अक्सर विफल रहता है, इस कोड के स्थानीय प्रदर्शन में सुधार होगा।

तो आप जानना चाहते हैं:

  • कार्यक्रम का एक प्रदर्शन के प्रति संवेदनशील हिस्से में सशर्त है (यदि नहीं, तो यह अनुकूलन में कोई मतलब नहीं है, स्पष्टता के लिए लिखना)
  • घटक के रिश्तेदार लागत शॉर्ट सर्किट अभिव्यक्ति
  • जो सस्ते संगणना (& & के लिए) असफल या (के लिए ||) सफल होने के बार-बार के संगणना।

इस मामले में आमतौर पर शॉर्ट सर्किट अभिव्यक्ति तत्वों को पुनर्व्यवस्थित करने के लायक है।

+0

संक्षिप्त और सरल उदाहरण और स्पष्टीकरण के लिए धन्यवाद। ऐसा लगता है कि अधिकांश लोगों ने सरल परिदृश्यों में ऐसा कहा है कि प्रदर्शन में सुधार के लिए उन्हें पुनर्व्यवस्थित करना सर्वोत्तम है, जटिल परिस्थितियों में इसका विश्लेषण करने की लागत किसी भी सुधार के प्रदर्शन से कहीं अधिक होगी। ऐसा लगता है कि कुंजी प्रदर्शन की कमी की बाधा से निपट रही है! धन्यवाद। –

+2

एफडब्ल्यूआईडब्ल्यू, जब मैं ऐसी सशर्त लिखता हूं, तो मैं जो भी जानता हूं, उसके आधार पर मैं इसे लिखने के बारे में निर्णय लेने का प्रयास करता हूं। कुछ इस समयपूर्व अनुकूलन को कॉल कर सकते हैं; मुझे लगता है कि pejoriative योग्य है।यदि सशर्त को शायद ही कभी निष्पादित किया जाता है, तो इससे कोई फर्क नहीं पड़ता कि मुझे आदेश गलत है या नहीं। यदि सशर्त दुर्घटनाग्रस्त होकर गर्म पथ में हो जाता है, तो जिस डिग्री पर मैंने सही अनुमान लगाया है, ऑर्डरिंग पहले से ही सही है और मुझे इस जगह को एक प्रोफाइलर के साथ नहीं ढूंढना है और इसे बाद में ठीक करना है; मेरा कोड पूरी तरह से ट्यून किया गया है। अगर मैंने इसे हर जगह किया है, तो मेरा कोड आम तौर पर वैसे भी बेहतर चलता है। –

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