যদি বনাম। সুইচ গতি


112

সংকলন অপ্টিমাইজেশনের কারণে স্যুইচ স্টেটমেন্টগুলি সাধারণত সমতুল্যর চেয়ে দ্রুত হয় - অন্যথায় - যদি বিবৃতিগুলি (যেমন এই নিবন্ধে বর্ণিত )।

এই অপ্টিমাইজেশনটি আসলে কীভাবে কাজ করে? কারও কি ভাল ব্যাখ্যা আছে?


3
ব্যাখ্যা করা হয়েছে: স্ট্যাকওভারফ্লো
ম্যাথু এম ওসোবার

একটি সম্ভাব্য ভাল উত্তর: dotnetperls.com/if-switch-performance
বাবাক

উত্তর:


185

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

এটি প্রচুর শৃঙ্খলাবদ্ধ ifপরীক্ষাগুলির চেয়ে অ্যাসিম্পটোটিক ভাল রানটাইম রয়েছে এবং তুলনামূলকভাবে কয়েকটি স্ট্রিংয়ের জন্য এমনকি দ্রুততর।


6
উত্তম উত্তর, হ্যাশ টেবিল সম্পর্কে আকর্ষণীয়।
ববিশ্যাফটো

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

এর অর্থ: স্যুইচ (এ) কেস "এক্স": কেস "ওয়াই": কেস "জেড": // কিছু বিরতি; } এর থেকে দ্রুত: যদি (a == "x" || a == "খ" || a == "সি") // কিছু ঠিক আছে?
yazanpro

এখানে আমাদের আর কোনও বাসা নেই, কেবল বা তাই আপনি কী ভাবেন?
ইয়াজানপ্রো

@ ইয়াজানপ্রো পুরানো সংকলকগুলিতে সম্ভাব্য হ্যাঁ (তবে মনে রাখবেন যে মামলার সংখ্যা এত কম যে এটি কোনও পার্থক্য নাও করতে পারে!)। আধুনিক সংকলকগুলি যদিও আরও অনেক বেশি কোড বিশ্লেষণ করে। ফলস্বরূপ, তারা বুঝতে পারে যে এই দুটি কোড স্নিপেট সমতুল্য, এবং একই অপটিমাইজেশন প্রয়োগ করে। তবে এটি আমার পক্ষে খাঁটি জল্পনা, কোনও সংকলক আসলে তা করে কিনা তা আমি জানি না।
কনরাড রুডল্ফ

15

এটি একটি সামান্য সরলকরণ যা সাধারণত কোনও আধুনিক সংকলক এমন একটি if..else if ..ক্রমের মুখোমুখি হয় যা তুচ্ছভাবে কোনও ব্যক্তির দ্বারা একটি স্যুইচ বিবৃতিতে রূপান্তরিত হতে পারে, সংকলকটিও তা করবে। তবে কেবল অতিরিক্ত মজা যুক্ত করার জন্য সংকলকটি সিনট্যাক্স দ্বারা সীমাবদ্ধ নয় তাই অভ্যন্তরীণভাবে "স্যুইচ" উত্পন্ন করতে পারে যা রেঞ্জ, একক লক্ষ্য ইত্যাদির মিশ্রণ রয়েছে - এবং তারা উভয় সুইচের জন্য এটি করতে পারে (এবং করবে) এবং যদি। অন্য বিবৃতি।

যাইহোক, Konrad এর উত্তরের একটি এক্সটেনশন হ'ল সংকলকটি একটি জাম্প টেবিল তৈরি করতে পারে তবে এটি গ্যারান্টিযুক্ত (প্রয়োজনীয় নয়) not বিভিন্ন কারণে জাম্প টেবিলগুলি আধুনিক প্রসেসরের শাখার ভবিষ্যদ্বাণীদের খারাপ কাজ করে এবং টেবিলগুলি নিজেরাই ক্যাশে আচরণের জন্য খারাপ কাজ করে, যেমন।

switch(a) { case 0: ...; break; case 1: ...; break; }

যদি কোনও সংকলক প্রকৃতপক্ষে এর জন্য একটি জাম্প টেবিল উত্পন্ন করে তবে সম্ভবত if..else if..শাখার ভবিষ্যদ্বাণীকে পরাস্ত করার ঝাঁপ সারণির কারণে বিকল্প স্টাইল কোডটি ধীর হবে ।


4

নো-ম্যাচের পরিসংখ্যানগুলি ভাল নাও হতে পারে।

যদি আপনি প্রকৃতপক্ষে উত্সটি ডাউনলোড করেন তবে কোনও মিলের মানগুলি যদি ইফ এবং স্যুইচ ক্ষেত্রে উভয়ই 21 হিসাবে পরিচিত হয়। কোন সংকলন সর্বদা চালিত হওয়া উচিত তা জেনে, এবং একটি সিপিইউ যথাযথভাবে পূর্বাভাস দিতে সক্ষম হওয়া উচিত, এটি বিমূর্ত করতে সক্ষম হওয়া উচিত।

আরও মজাদার ঘটনাটি হ'ল আমার মতে, যখন প্রতিটি কেস না ভেঙে যায় তবে তা পরীক্ষার সুযোগ নাও থাকতে পারে।


4

স্যুইচ / কেস স্টেটমেন্টগুলি সাধারণত 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;
    }

হ্যাঁ এটি একটি প্রাথমিক উদাহরণ, তবে এটি বিষয়টি ব্যাখ্যা করে।

সুতরাং একটি উপসংহারে কেবলমাত্র এক স্তর গভীর যা সাধারণ প্রকারের জন্য স্যুইচ / কেস ব্যবহার হতে পারে, তবে আরও জটিল তুলনা এবং একাধিক নেস্টেড স্তরের জন্য / অন্যটি নির্মাণ করলে ক্লাসিক ব্যবহার করেন?


-1: 1. নিবন্ধটি শাখার ভবিষ্যদ্বাণীটিকে সম্পূর্ণ উপেক্ষা করেছে, ২. অ্যালগরিদমগুলি হুবহু নয় (লিঙ্কে থাকা একক যদি অন্যটি ইতিমধ্যে আরও অনুকূলিতভাবে কোডিং করা থাকে) এবং ৩ প্রাপ্ত পার্থক্যগুলি এত ছোট যে কোনও অজুহাত দেখায় না যথাযথ, পরিষ্কার কোড ব্যবহার (প্রায় 4 এনএস মধ্যে 10.000.000 কলগুলির মধ্যে স্যুইচ এবং একইরকম যদি অন্য নির্মাণ হয়)
ট্রোজানার

স্যুইচ ব্লকের কয়েকটি মামলার কারণে সেই উদাহরণটি অনুকূলিত হবে না। সাধারণত 5-6 উপাদানগুলির পরে এটি একটি লাফ টেবিল তৈরি করে।
এন্টিডিউ

0

যদি ওভার কেসটির একমাত্র সুবিধা হ'ল যখন প্রথম মামলার ঘটনা ঘনত্বের লক্ষণীয় বৃদ্ধি ঘটে।

প্রান্তিকের অবস্থানটি ঠিক কোথায় তা নিশ্চিত না, তবে প্রথম "প্রায় সর্বদা" প্রথম পরীক্ষায় পাস না হলে আমি কেস সিনট্যাক্স ব্যবহার করি।

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