এই ধরণের রিফ্যাক্টরিংয়ের জন্য শব্দটি কী


33

আমি নিশ্চিত যে নিম্নলিখিত বিট রিফ্যাক্টরিংয়ের জন্য একটি পদ আছে তবে আমি এটি মনে করতে পারি না এবং আমার গুগল-ফু আমাকে ব্যর্থ করছে!

রিফ্যাক্টরটি সরানো হয় যদি বিবৃতিগুলি যেখানে তাদের সবচেয়ে বেশি প্রভাব ফেলতে চলেছে, উদাহরণস্বরূপ এটি পরিবর্তন করা

$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
আমি @ স্টিজনকে সম্মত করি - এমন কিছু জিনিস রয়েছে যা সংকলককে উদ্বিগ্ন করা যুক্তিসঙ্গত, তবে এটি তাদের মধ্যে একটি নয়!
টবি

@ টবি: যদিও এটি নতুন কোডের জন্য সত্য (সর্বোপরি, লুপ-ইনগ্রায়েন্ট মুভটি একটি সহজ-বোঝা অভ্যন্তরীণ লুপ তৈরি করে), কম্পাইলার দ্বারা ইতিমধ্যে যা কিছু করা হয়েছে তা হাতে হাতে করার দরকার নেই। আমি কেবল উপরের উদাহরণের মতো পুরানো কোডটি দিতাম; LICM এর মান উন্নতি ছোট এবং সম্ভবত আপনার সময়ের জন্য উপযুক্ত নয়।
থিটন

12
@ তিতে আমি একমত নই এটিকে যথার্থ হিসাবে ছেড়ে যাওয়ার অর্থ ভবিষ্যতের সমস্ত রক্ষণাবেক্ষণকারীকে একই যুক্তির মধ্য দিয়ে যেতে হবে। সময় নষ্ট করে; শুধু এটি পরিবর্তন করুন।
ইজকাটা

2
@zzzzBov হ্যাঁ আমি জানি, তবে আমার বক্তব্যটি হ'ল প্যাটার্নটি যখন লুকানো থাকে তখন সম্ভবত এটি আর ঠিক প্যাটার্নটি নয়। বা এমন কিছু। (দুঃখিত, দীর্ঘ দিন)
stijn

10

একে বলা হয় hoistingবা scalar promotionএখানে দেখুন :

উত্তোলনের অর্থ হ'ল আপনি একটি লুপ থেকে কিছু অপারেশন টেনে নিয়েছেন কারণ লুপ নিজেই অপারেশনের ফলাফলকে প্রভাবিত করে না। আপনার ক্ষেত্রে, আপনি যখন লুপটি সরিয়ে শর্তসাপেক্ষ পরীক্ষাটি উত্তোলন করছেন।

পুনরায় অর্ডার করার অর্থ নির্দেশের ক্রমটি এমনভাবে পরিবর্তন করা হয় যাতে ফলাফল প্রভাবিত হয় না। সাধারণত এটি কোনও ডেটা নির্ভরতা ছাড়াই সংলগ্ন নির্দেশাবলী হবে, উদাহরণস্বরূপ, আপনি নিম্নলিখিত দুটি বিবৃতি কোন আদেশটি সম্পাদন করেন তা বিবেচ্য নয়:

int a = x;
int b = y;


0

আমি মনে করি না যে এ জাতীয় রিফ্যাক্টরিং বিদ্যমান।

সুতরাং, এটি '' রিফ্যাক্টরিংগুলির তালিকাগুলির মধ্যে খুঁজে পাওয়া শক্ত হবে ''।

আমি এই উদাহরণটি একটি অপ্টিমাইজেশন হিসাবে ক্লাস করব না refactoring

রিফ্যাক্টরিং, আমার কাছে কোডটি এর আচরণকে প্রভাবিত না করেই বোঝার উন্নতি করতে কোড পরিবর্তন করছে।

আমার কাছে অপ্টিমাইজেশান, কর্মক্ষমতা উন্নত করতে কোড পরিবর্তন করছে is

অপ্টিমাইজড কোডটি বোঝার জন্য কম সহজ হতে থাকে। দুটি অনুশীলন একে অপরের বিরুদ্ধে কাজ করতে ঝোঁক।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.