সংকলন অপ্টিমাইজেশনের কারণে স্যুইচ স্টেটমেন্টগুলি সাধারণত সমতুল্যর চেয়ে দ্রুত হয় - অন্যথায় - যদি বিবৃতিগুলি (যেমন এই নিবন্ধে বর্ণিত )।
এই অপ্টিমাইজেশনটি আসলে কীভাবে কাজ করে? কারও কি ভাল ব্যাখ্যা আছে?
সংকলন অপ্টিমাইজেশনের কারণে স্যুইচ স্টেটমেন্টগুলি সাধারণত সমতুল্যর চেয়ে দ্রুত হয় - অন্যথায় - যদি বিবৃতিগুলি (যেমন এই নিবন্ধে বর্ণিত )।
এই অপ্টিমাইজেশনটি আসলে কীভাবে কাজ করে? কারও কি ভাল ব্যাখ্যা আছে?
উত্তর:
সংকলক প্রযোজ্য যেখানে জাম্প টেবিলগুলি তৈরি করতে পারে। উদাহরণস্বরূপ, আপনি উত্পাদিত কোডটি দেখার জন্য প্রতিবিম্বটি ব্যবহার করার সময় আপনি দেখতে পাবেন স্ট্রিংগুলিতে বিশাল সুইচগুলির জন্য, সংকলকটি আসলে এই কোডটি তৈরি করে যা এইগুলি প্রেরণের জন্য একটি হ্যাশ টেবিল ব্যবহার করে। হ্যাশ টেবিলটি কী হিসাবে স্ট্রিংগুলি এবং case
কোডগুলিকে মান হিসাবে প্রতিনিধি হিসাবে ব্যবহার করে ।
এটি প্রচুর শৃঙ্খলাবদ্ধ if
পরীক্ষাগুলির চেয়ে অ্যাসিম্পটোটিক ভাল রানটাইম রয়েছে এবং তুলনামূলকভাবে কয়েকটি স্ট্রিংয়ের জন্য এমনকি দ্রুততর।
এটি একটি সামান্য সরলকরণ যা সাধারণত কোনও আধুনিক সংকলক এমন একটি if..else if ..
ক্রমের মুখোমুখি হয় যা তুচ্ছভাবে কোনও ব্যক্তির দ্বারা একটি স্যুইচ বিবৃতিতে রূপান্তরিত হতে পারে, সংকলকটিও তা করবে। তবে কেবল অতিরিক্ত মজা যুক্ত করার জন্য সংকলকটি সিনট্যাক্স দ্বারা সীমাবদ্ধ নয় তাই অভ্যন্তরীণভাবে "স্যুইচ" উত্পন্ন করতে পারে যা রেঞ্জ, একক লক্ষ্য ইত্যাদির মিশ্রণ রয়েছে - এবং তারা উভয় সুইচের জন্য এটি করতে পারে (এবং করবে) এবং যদি। অন্য বিবৃতি।
যাইহোক, Konrad এর উত্তরের একটি এক্সটেনশন হ'ল সংকলকটি একটি জাম্প টেবিল তৈরি করতে পারে তবে এটি গ্যারান্টিযুক্ত (প্রয়োজনীয় নয়) not বিভিন্ন কারণে জাম্প টেবিলগুলি আধুনিক প্রসেসরের শাখার ভবিষ্যদ্বাণীদের খারাপ কাজ করে এবং টেবিলগুলি নিজেরাই ক্যাশে আচরণের জন্য খারাপ কাজ করে, যেমন।
switch(a) { case 0: ...; break; case 1: ...; break; }
যদি কোনও সংকলক প্রকৃতপক্ষে এর জন্য একটি জাম্প টেবিল উত্পন্ন করে তবে সম্ভবত if..else if..
শাখার ভবিষ্যদ্বাণীকে পরাস্ত করার ঝাঁপ সারণির কারণে বিকল্প স্টাইল কোডটি ধীর হবে ।
নো-ম্যাচের পরিসংখ্যানগুলি ভাল নাও হতে পারে।
যদি আপনি প্রকৃতপক্ষে উত্সটি ডাউনলোড করেন তবে কোনও মিলের মানগুলি যদি ইফ এবং স্যুইচ ক্ষেত্রে উভয়ই 21 হিসাবে পরিচিত হয়। কোন সংকলন সর্বদা চালিত হওয়া উচিত তা জেনে, এবং একটি সিপিইউ যথাযথভাবে পূর্বাভাস দিতে সক্ষম হওয়া উচিত, এটি বিমূর্ত করতে সক্ষম হওয়া উচিত।
আরও মজাদার ঘটনাটি হ'ল আমার মতে, যখন প্রতিটি কেস না ভেঙে যায় তবে তা পরীক্ষার সুযোগ নাও থাকতে পারে।
স্যুইচ / কেস স্টেটমেন্টগুলি সাধারণত 1-স্তরের গভীর হতে পারে তবে আপনি যখন 2 বা ততোধিক হয়ে উঠতে শুরু করেন, স্যুইচ / কেস স্টেটমেন্টগুলি যদি / অন্য বিবৃতিতে নেস্ট করা থাকে ততক্ষণ 2-3 বার নেওয়া শুরু করে।
এই নিবন্ধটিতে গতির পার্থক্যগুলি হাইলাইট করার সময় কিছু গতির তুলনা রয়েছে যখন এ জাতীয় বিবৃতি নেস্ট করা হয়।
উদাহরণস্বরূপ, তাদের পরীক্ষা অনুযায়ী নিম্নলিখিতগুলির মতো নমুনা কোড:
if (x % 3 == 0)
if (y % 3 == 0)
total += 3;
else if (y % 3 == 1)
total += 2;
else if (y % 3 == 2)
total += 1;
else
total += 0;
else if (x % 3 == 1)
if (y % 3 == 0)
total += 3;
else if (y % 3 == 1)
total += 2;
else if (y % 3 == 2)
total += 1;
else
total += 0;
else if (x % 3 == 2)
if (y % 3 == 0)
total += 3;
else if (y % 3 == 1)
total += 2;
else if (y % 3 == 2)
total += 1;
else
total += 0;
else
if (y % 3 == 0)
total += 3;
else if (y % 3 == 1)
total += 2;
else if (y % 3 == 2)
total += 1;
else
total += 0;
সমতুল্য স্যুইচ / কেস স্টেটমেন্টটি চালানোর জন্য অর্ধেক সময় শেষ হয়েছে :
switch (x % 3)
{
case 0:
switch (y % 3)
{
case 0: total += 3;
break;
case 1: total += 2;
break;
case 2: total += 1;
break;
default: total += 0;
break;
}
break;
case 1:
switch (y % 3)
{
case 0: total += 3;
break;
case 1: total += 2;
break;
case 2: total += 1;
break;
default: total += 0;
break;
}
break;
case 2:
switch (y % 3)
{
case 0: total += 3;
break;
case 1: total += 2;
break;
case 2: total += 1;
break;
default: total += 0;
break;
}
break;
default:
switch (y % 3)
{
case 0: total += 3;
break;
case 1: total += 2;
break;
case 2: total += 1;
break;
default: total += 0;
break;
}
break;
}
হ্যাঁ এটি একটি প্রাথমিক উদাহরণ, তবে এটি বিষয়টি ব্যাখ্যা করে।
সুতরাং একটি উপসংহারে কেবলমাত্র এক স্তর গভীর যা সাধারণ প্রকারের জন্য স্যুইচ / কেস ব্যবহার হতে পারে, তবে আরও জটিল তুলনা এবং একাধিক নেস্টেড স্তরের জন্য / অন্যটি নির্মাণ করলে ক্লাসিক ব্যবহার করেন?