লুপ বিপরীত কৌশল কী?


89

আমি এমন একটি নথির মধ্য দিয়ে যাচ্ছিলাম যা জাভা-র জন্য জাস্ট -ইন-টাইম সংকলক (জেআইটি) অপ্টিমাইজেশন কৌশলগুলি সম্পর্কে কথা বলছে । এর মধ্যে একটি হ'ল "লুপ বিপর্যয়"। এবং নথিটি বলে:

আপনি একটি whileলুপ দিয়ে একটি নিয়মিত লুপ প্রতিস্থাপন do-while। এবং একটি do-whileলুপের মধ্যে লুপ সেট করা আছে if। এই প্রতিস্থাপনটি দুটি কম লাফ দেয়।

কীভাবে লুপ বিপর্যয় কাজ করে এবং কীভাবে এটি আমাদের কোডের পথটিকে অনুকূল করে?

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


4
এটি আপনার উত্স কোডটি করতে এমন কিছু নয়। এটি স্থানীয় কোড স্তরে ঘটে।
মার্কো টপলনিক

4
@ মারকোটোপলনিক আমি জানি তবে আমি জানতে চাইছি কীভাবে জেআইটি স্থানীয় কোড স্তরে এটি করে। ধন্যবাদ
চেষ্টা করছেন

4
ওহ দুর্দান্ত, এ সম্পর্কে একটি উইকিপিডিয়া পৃষ্ঠা রয়েছে প্রচুর উদাহরণ সহ en.wikedia.org/wiki/Loop_inversion । সি উদাহরণ জাভা হিসাবে ঠিক যেমন বৈধ।
বেনিয়ামিন গ্রুইনবাউম

কিছু সময় আগে এসও সম্পর্কিত একটি প্রশ্নের দ্বারা অনুপ্রাণিত হয়ে আমি এই বিষয়ে একটি সংক্ষিপ্ত গবেষণা চালিয়েছি
অ্যাডাম সিমিয়ন

এটি কি একই জিনিস যেখানে লুপের শর্তটি সাধারণত শেষে দেওয়া হয় (সেখানে কম লাফ দেওয়া হবে কিনা তা নির্বিশেষে), যাতে কম লাফের নির্দেশনা রয়েছে (পুনরুত্রের প্রতি 1 বনাম 2)?
চূড়ান্তভাবে 5

উত্তর:


108
while (condition) { 
  ... 
}

কর্মধারা:

  1. শর্ত শর্ত;
  2. মিথ্যা হলে লুপের বাইরের দিকে ঝাঁপ দাও;
  3. একটি পুনরাবৃত্তি চালান;
  4. শীর্ষে ঝাঁপ দাও।

if (condition) do {
  ...
} while (condition);

কর্মধারা:

  1. শর্ত শর্ত;
  2. যদি মিথ্যা হয় তবে লুপের ওপারে ঝাঁপ দাও;
  3. একটি পুনরাবৃত্তি চালান;
  4. শর্ত শর্ত;
  5. যদি সত্য হয় তবে পদক্ষেপ 3 এ যান।

এই দুটিটির তুলনা করে আপনি সহজেই দেখতে পাবেন যে পরবর্তীগুলি কোনও লাফাই নাও পারে, তবে প্রদত্ত যে লুপটির মধ্য দিয়ে ঠিক এক ধাপ রয়েছে এবং সাধারণত জাম্পের সংখ্যা পুনরাবৃত্তির সংখ্যার চেয়ে কম হবে। কন্ডিশনটি মিথ্যা হলে কেবল লুপ থেকে লাফিয়ে বাইরে যেতে কন্ডিশনটি পরীক্ষা করতে প্রাক্তনটিকে পিছনে ঝাঁপ দিতে হবে।

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

উল্লিখিত শাখার পূর্বাভাস ব্যাখ্যা করা : প্রতিটি ধরণের শর্তসাপেক্ষ জাম্পের জন্য সিপিইউতে দুটি নির্দেশনা রয়েছে, যার প্রত্যেকটিতে ফলাফলের উপর বাজি রয়েছে । উদাহরণস্বরূপ, আপনি একটি নির্দেশ রেখেছিলেন " শূন্য না হলে ঝাঁপ দাও, শূন্য নয় বাজি " একটি লুপের শেষে, কারণ শেষটি বাদে সমস্ত লাফিয়ে লাফাতে হবে। এইভাবে সিপিইউ নিজে লাফ নির্দেশ অনুসরণকারীদের পরিবর্তে জাম্প টার্গেট অনুসরণ করার নির্দেশাবলী দিয়ে তার পাইপলাইন পাম্প করা শুরু করে।

গুরুত্বপূর্ণ তথ্য

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


51
শেষে যে নোটটি সত্যই একটি খুব, খুব গুরুত্বপূর্ণ জিনিস।
টিজে ক্রাউডার

4
@ অ্যাডামসিমন: প্রদত্ত do-whileউত্স কোডের জন্য উত্পন্ন বাইটকোড অপ্রাসঙ্গিক, কারণ আমরা আসলে এটি লিখি না। আমরা whileলুপটি লিখি এবং সংকলক এবং জেআইটি যদি প্রয়োজন হিসাবে আমাদের জন্য এটি (লুপ বিপর্যয়ের মাধ্যমে) উন্নত করার ষড়যন্ত্র করে।
টিজে ক্রাউডার

4
উপরের জন্য @ টিজে ক্রাউডার +1, এবং অ্যাডামের কাছে নোট: জেআইটি সংকলকের অপ্টিমাইজেশান সম্পর্কে চিন্তা করার সময় বাইটকোডটি কখনই বিবেচনা করবেন না । বাস্তবায়িত জেআইটি-সংকলিত কোড সম্পাদনের চেয়ে বাইটকোড জাভা উত্স কোডের অনেক বেশি কাছাকাছি। প্রকৃতপক্ষে, আধুনিক ভাষার প্রবণতা ভাষা বর্ধনের অংশ হিসাবে মোটেও বাইটকোড না থাকা tec
মার্কো টপলনিক

4
অতিরিক্ত তথ্যবহুল হত গুরুত্বপূর্ণ নোটটি আরও কিছুটা ব্যাখ্যা করা হয়েছিল। কেন এটি পুরোপুরি বিভ্রান্ত হবে?
arsaKasra

4
@arsaKasra এটি বিভ্রান্তিকর কারণ সোর্স কোডে সাধারণ পাঠযোগ্যতা এবং স্থায়িত্বের ট্রাম্প অপ্টিমাইজেশনে। বিশেষ করে আপনার কাছে জেআইটি এটি প্রকাশ করে বলে, আপনার নিজের (খুব মাইক্রো) অপ্টিমাইজেশানের চেষ্টা করা উচিত নয়।
রেডিওডেফ

24

এটি সর্বদা অন্তত একবার কার্যকর করা হয় এমন একটি লুপটি অনুকূল করতে পারে।

একটি নিয়মিত whileলুপ তখন সর্বদা কমপক্ষে একবার শুরুতে ফিরে যায় এবং একবার শেষে একবার লাফ দেয়। সরল লুপ একবার চালানোর উদাহরণ:

int i = 0;
while (i++ < 1) {
    //do something
}  

do-whileঅন্যদিকে একটি লুপ প্রথম এবং শেষ জাম্প এড়িয়ে যাবে। এখানে উপরেরটির সমতুল্য লুপটি রয়েছে যা জাম্প ছাড়াই চলবে:

int i = 0;
if (i++ < 1) {
    do {
        //do something
    } while (i++ < 1); 
}

সঠিক এবং প্রথম হওয়ার জন্য +1, দয়া করে একটি কোড উদাহরণ যুক্ত করার বিষয়ে বিবেচনা করুন। ভালো কিছু boolean b = true; while(b){ b = maybeTrue();}করার জন্য boolean b;do{ b = maybeTrue();}while(b);যথেষ্ট হবে।
বেনিয়ামিন গ্রুইনবাউম

কোন চিন্তা করো না. এটি এক প্রকারের উত্তরের প্রারম্ভিক রেখাটিকে অকার্যকর করে তোলে wi :-)
টিজে ক্রাউডার

@ টিজে ওয়েল, এটি এখনও প্রবেশ করে না এমন লুপটিকে অনুকূলিত করবে না, উভয় ক্ষেত্রেই এক লাফ থাকবে।
কেপিল

অই হ্যাঁ. দুঃখিত, আমি এটি পড়ছিলাম তার অর্থ আপনি এই লুপগুলিতে প্রয়োগ করতে পারবেন না যা অন্তত একবার লুপ করেনি (বরং এটি তাদের সাহায্য করে না)। তোমার সাথে এখন :-)
টিজে ক্রোডার

@ কেপপিল আপনার সম্ভবত স্পষ্ট করে জানা উচিত যে আমাদের ক্ষেত্রে প্রচুর পরিমাণে পুনরাবৃত্তি এক্স রয়েছে, তবে আমরা কেবল এক্স এর মধ্যে একটি মাত্র লাফ বাঁচাতে পারব।
ম্যানুয়েল সেলভা

3

আসুন তাদের মাধ্যমে চলুন:

whileসংস্করণ:

void foo(int n) {
    while (n < 10) {
       use(n);
       ++n;
    }
    done();
}
  1. শর্তটি সত্য না হলে প্রথমে আমরা পরীক্ষা করে nলাফিয়ে যাই done();
  2. তারপরে আমরা ব্যবহার করি এবং ইনক্রিমেন্ট করি n
  3. এখন আমরা কন্ডিশনে ফিরে আসি।
  4. ধুয়ে ফেলুন, পুনরাবৃত্তি করুন।
  5. যখন অবস্থাটি আর সত্য হয় না, তখন আমরা লাফিয়ে উঠি done()

do-whileসংস্করণ:

(মনে রাখবেন, আমরা আসলে সোর্স কোডে এটি করি না [যা রক্ষণাবেক্ষণের সমস্যাগুলি প্রবর্তন করবে], সংকলক / জেআইটি এটি আমাদের জন্য করে))

void foo(int n) {
    if (n < 10) {
        do {
            use(n);
            ++n;
        }
        while (n < 10);
    }
    done();
}
  1. শর্তটি সত্য না হলে প্রথমে আমরা পরীক্ষা করে nলাফিয়ে যাই done();
  2. তারপরে আমরা ব্যবহার করি এবং ইনক্রিমেন্ট করি n
  3. এখন আমরা শর্তটি পরীক্ষা করি এবং যদি এটি সত্য হয় তবে ফিরে যাব।
  4. ধুয়ে ফেলুন, পুনরাবৃত্তি করুন।
  5. যখন অবস্থাটি আর সত্য হয় না, তখন আমরা প্রবাহিত হই (লাফাই না) done()

উদাহরণস্বরূপ, যদি অস্তিত্ব nশুরু হয় 9, আমরা do-whileসংস্করণে কখনই লাফাই না , যখন whileসংস্করণে আমাদের শুরুতে ফিরে যেতে হয়, পরীক্ষা করা হয়, এবং যখন আমরা সত্য দেখি তখন শেষ পর্যন্ত ফিরে যেতে হয় true ।


3

লুপ বিপর্যয় একটি পারফরম্যান্স অপটিমাইজেশন কৌশল যা কার্যকারিতা উন্নত করে কারণ প্রসেসর কম নির্দেশাবলীর সাহায্যে একই ফলাফল অর্জন করতে পারে। এটি বেশিরভাগ সীমানা শর্তে কর্মক্ষমতা উন্নত করা উচিত।

এই লিঙ্কটি লুপ বিপরীতে অন্য উদাহরণ সরবরাহ করে। কিছু আর্কিটেকচারে যেখানে হ্রাস এবং তুলনা একটি একক নির্দেশিকা সেট হিসাবে প্রয়োগ করা হয়, হ্রাস এবং তুলনা অপারেশন সহ একটি লুপের জন্য কিছুক্ষণ রূপান্তর করা বুদ্ধিমান হয়ে ওঠে।

উইকিপিডিয়ায় একটি খুব ভাল উদাহরণ রয়েছে এবং আমি এটি এখানে আবার ব্যাখ্যা করছি।

 int i, a[100];
  i = 0;
  while (i < 100) {
    a[i] = 0;
    i++;
  }

সংকলক দ্বারা রূপান্তরিত হবে

  int i, a[100];
  i = 0;
  if (i < 100) {
    do {
      a[i] = 0;
      i++;
    } while (i < 100);
  }

এটি কীভাবে পারফরম্যান্সে অনুবাদ করে? যখন i এর মান 99 হয়, প্রসেসরের কোনও GOTO সঞ্চালনের প্রয়োজন হয় না (যা প্রথম ক্ষেত্রে প্রয়োজন)। এটি কর্মক্ষমতা উন্নত করে।

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