इस प्रकार के रिफैक्टरिंग के लिए क्या शब्द है


33

मुझे यकीन है कि निम्नलिखित में से कुछ के लिए एक शब्द है, लेकिन मैं इसे याद नहीं रख सकता और मेरा Google-फू मुझे विफल कर रहा है!

रिफ्लेक्टर चलता है अगर बयान जहां वे सबसे अधिक प्रभाव डालने जा रहे हैं, उदाहरण के लिए इसे बदलना

$test = someFunctionThatReturnsABool();
for($x = 0; $x < 10000; $x++) {
    if ($test) { 
        echo $x; 
    }
}

इसके लिए

$test = someFunctionThatReturnsABool();
if ($test) {
    for($x = 0; $x < 10000; $x++) {
        echo $x; 
    }
}

जवाबों:


56

यह लूप-इनवेरिएंट कोड मोशन है । एक अच्छा संकलक इसे अपने दम पर करना चाहिए।

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

यदि हम निम्नलिखित कोड नमूने पर विचार करते हैं, तो दो अनुकूलन आसानी से लागू किए जा सकते हैं।

for (int i = 0; i < n; i++) {
    x = y + z;
    a[i] = 6 * i + x * x;
}

गणना x = y + zऔर x * xलूप के बाहर ले जाया जा सकता है क्योंकि वे लूप इनवेरिएंट हैं - वे लूप के पुनरावृत्तियों पर नहीं बदलते हैं - इसलिए अनुकूलित कोड कुछ इस तरह होगा:

x = y + z;
t1 = x * x;
for (int i = 0; i < n; i++) {
    a[i] = 6 * i + t1;
}

इस कोड को आगे भी अनुकूलित किया जा सकता है ...


55
एक अच्छा प्रोग्रामर उस पर यह करना चाहिए खुद है और साथ ही, मुझे लगता है
टिजिन

8
मैं सहमत हूँ @stijn - कुछ चीजें हैं जो संकलक के बारे में चिंता करने के लिए उचित है, लेकिन यह उनमें से एक नहीं है!
टॉबी

@ टॉबी: हालांकि यह नए कोड के लिए सही है (आखिरकार, लूप-इनवेरिएंट मूव आसान-समझा जाने वाला इनर लूप बनाता है), कुछ भी जो पहले से कंपाइलर द्वारा किया जाता है उसे हाथ से करने की जरूरत नहीं है। मैं पुराने कोड को उपरोक्त उदाहरण के रूप में बताता हूं; LICM का गुणवत्ता सुधार छोटा है और शायद आपके समय के लायक नहीं है।
थिटोन

12
@thiton मैं असहमत हूं। इसे छोड़ना-जैसा मतलब होगा भविष्य के सभी अनुरक्षकों को उसी तर्क से गुजरना होगा। यह समय बर्बाद करता है; बस इसे बदलो।
इजाकाता

2
@zzzzBov हाँ मुझे पता है, लेकिन मेरी बात यह है कि जब पैटर्न छिपा हुआ है, तो शायद यह अब बिल्कुल पैटर्न नहीं है। या कुछ इस तरह का। (क्षमा करें, लंबा दिन)
स्टिकn

10

इसे hoistingया भी कहते हैं scalar promotionयहाँ देखें :

उत्थापन का अर्थ है कि आपने कुछ ऑपरेशन को एक लूप से बाहर निकाला है क्योंकि लूप स्वयं ऑपरेशन के परिणाम को प्रभावित नहीं करता है। आपके मामले में, आप सशर्त परीक्षा को लूप से बाहर निकाल रहे हैं।

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

int a = x;
int b = y;


0

मुझे नहीं लगता कि इस तरह की रिफैक्टिंग मौजूद है।

इसलिए, इसे '' रिफैक्टरिंग की सूची '' के बीच खोजना मुश्किल होगा।

मैं एक के रूप में वर्ग कि उदाहरण चाहते अनुकूलन नहीं एक रिफैक्टरिंग

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

मेरे लिए अनुकूलन, प्रदर्शन में सुधार करने के लिए कोड बदल रहा है।

चूंकि अनुकूलित कोड समझने में कम आसान होता है। दो अभ्यास एक दूसरे के खिलाफ काम करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.