জাভাতে / অন্য বনাম সুইচ স্টেটমেন্টের তুলনামূলক পারফরম্যান্সের পার্থক্যটি কী?


122

আমার ওয়েব অ্যাপ্লিকেশনটির পারফরম্যান্স নিয়ে চিন্তিত হয়ে আমি ভাবছি যে "যদি / অন্য" বা সুইচ স্টেটমেন্টটি কোনটির চেয়ে ভাল?


6
আপনার কাছে কি মনে করার কোনও কারণ আছে যে দুটি বাই কনস্ট্রাক্টের জন্য একই বাইটোকডটি উত্পন্ন নয়?
পাস্কেল কুয়াক

2
@Pascal আছে: অপ্টিমাইজেশান পরিবর্তে টেবিল বর্ণন আপগুলি ব্যবহারের একটি তালিকার দ্বারা সম্পন্ন করা যেতে পারে ifইত্যাদি
jldupont

18
"অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল" - ডোনাল্ড নুথ
নিখুঁত

104
যদিও এটি অবশ্যই অকালীন অপটিমাইজেশন, "প্রসঙ্গের তুলনায় খারাপভাবে নেওয়া একটি উক্তিটির প্রতি নিরবচ্ছিন্নতা মেনে চলা আমাদের কেবলমাত্র যুক্তিযুক্ত প্রতিক্রিয়াশীল জিইউআই প্রদর্শন করার জন্য একটি উচ্চ-শেষ মাল্টি-কোর কম্পিউটারের প্রয়োজন" - মি।
লরেন্স ডল

2
নুথের একটি নির্দিষ্ট মন রয়েছে। কোয়ালিফায়ার "অকাল" নোট করুন। অনুকূলকরণ একটি পুরোপুরি বৈধ উদ্বেগ। এটি বলেছিল যে একটি সার্ভার আইও আবদ্ধ এবং নেটওয়ার্ক এবং ডিস্কের বাধা হ'ল আপনি নিজের সার্ভারে যা চালাচ্ছেন তার চেয়ে আরও তাত্পর্যপূর্ণ অর্ডার।
আলফাজেরো

উত্তর:


108

এটি মাইক্রো অপ্টিমাইজেশন এবং অকাল অপটিমাইজেশন, যা মন্দ। বরং পাঠযোগ্যতা এবং প্রশ্নে কোডটির রক্ষণাবেক্ষণের বিষয়ে চিন্তা করুন। যদি সেখানে if/elseদুটিরও বেশি ব্লক একসাথে আটকানো থাকে বা এর আকারটি অনির্দেশ্য হয়, তবে আপনি সম্ভবত একটি switchবিবৃতি বিবেচনা করতে পারেন ।

বিকল্পভাবে, আপনি পলিমারফিজমও ধরতে পারেন । প্রথমে কিছু ইন্টারফেস তৈরি করুন:

public interface Action { 
    void execute(String input);
}

এবং কিছু বাস্তবায়ন ধরে রাখুন Map। আপনি এটি স্থিতিশীল বা গতিশীলভাবে করতে পারেন:

Map<String, Action> actions = new HashMap<String, Action>();

শেষ পর্যন্ত if/elseবা এর switchমতো কিছু দ্বারা প্রতিস্থাপন করুন (নালপয়েন্টারগুলির মতো তুচ্ছ পরীক্ষাগুলি একপাশে রেখে):

actions.get(name).execute(input);

এটা if/else বা এর চেয়ে মাইক্রো ফ্ল্লো হতে পারে switchতবে কোডটি কমপক্ষে আরও ভাল রক্ষণাবেক্ষণযোগ্য।

আপনি যেমন ওয়েব অ্যাপ্লিকেশন সম্পর্কে কথা বলছেন, আপনি HttpServletRequest#getPathInfo()অ্যাকশন কী হিসাবে ব্যবহার করতে পারেন (অবশেষে কোনও ক্রম সন্ধান না হওয়া পর্যন্ত প্যাথিনফোর শেষ অংশটি একটি লুপে বিভক্ত করতে আরও কিছু কোড লিখুন)। আপনি এখানে অনুরূপ উত্তর পেতে পারেন:

আপনি যদি জাভা EE ওয়েব অ্যাপ্লিকেশন কর্মক্ষমতা সম্পর্কে সাধারণভাবে উদ্বিগ্ন হন তবে আপনি এই নিবন্ধটিও দরকারী হিসাবে পেতে পারেন । অন্যান্য ক্ষেত্রগুলি রয়েছে যা কেবলমাত্র (মাইক্রো) কাঁচা জাভা কোডটি অনুকূলকরণের চেয়ে অনেক বেশি পারফরম্যান্স লাভ দেয় ।


1
বা পরিবর্তে
বহুকর্ম

এটি "অপ্রত্যাশিত" পরিমাণের ক্ষেত্রে / অন্য ব্লকগুলির ক্ষেত্রে আরও বেশি প্রস্তাবিত recommended
BalusC

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

8
হ্যাশম্যাপ দেখার সংস্করণটি কোনও টেবিলউইচস নির্দেশের তুলনায় সহজেই 10 গুণ ধীর হতে পারে। আমি এই "মাইক্রোস্লোভার" বলব না!
x4u

7
আমি সুইচ স্টেটমেন্ট সহ সাধারণ ক্ষেত্রে জাভাটির অভ্যন্তরীণ কাজগুলি সম্পর্কে জানতে আগ্রহী - আমি কেউ প্রাথমিক ধারণাটিকে অতি-অগ্রাধিকারের সাথে সম্পর্কিত বলে মনে করি কিনা তা সম্পর্কে আমি আগ্রহী নই। বলা হচ্ছে, কেন আমার এই উত্তরটি এত বেশি উত্সাহিত হয়েছে এবং কেন এটি স্বীকৃত উত্তর ... আমি একেবারেই ধারণা করি না এটি প্রাথমিক প্রশ্নের উত্তর দেওয়ার জন্য কিছুই করে না।
সন্ধানীঘাইন

125

অকাল অপটিমাইজেশন এড়াতে এমন কিছু বলে আমি এই মতামতের সাথে সম্পূর্ণ একমত agree

তবে এটি সত্য যে জাভা ভিএম-এর বিশেষ বাইকোড রয়েছে যা সুইচ () এর জন্য ব্যবহার করা যেতে পারে।

দেখুন শর্তাবলীবুঝতে ফটকা খেলা ( lookupswitch এবং tableswitch )

সুতরাং কিছু পারফরম্যান্স লাভ হতে পারে, যদি কোডটি পারফরম্যান্স সিপিইউ গ্রাফের অংশ হয়।


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

5
+1 স্ট্যাকওভারফ্লো . com / a / 15621602 / 89818 হিসাবে মনে হচ্ছে পারফরম্যান্সের লাভগুলি সত্যিই আছে এবং আপনি 18+ কেস ব্যবহার করেন তবে আপনার একটি সুবিধা দেখা উচিত।
কাওয়াই 25'14

52

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

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

switch (<condition>) {
   case c_0: ...
   case c_1: ...
   ...
   case c_n: ...
   default: ...
}

যেখানে c_0,, c_1..., এবং c_Nঅবিচ্ছেদ্য সংখ্যা যা স্যুইচ স্টেটমেন্টের লক্ষ্য, এবং <condition>অবশ্যই একটি পূর্ণসংখ্যার এক্সপ্রেশনটির সমাধান করতে হবে।

  • যদি এই সেটটি "ঘন" হয় - তবে, (সর্বাধিক (সি i ) + 1 - মিনিট (সি i )) / n> α, যেখানে 0 <কে <α <1, যেখানে kকিছু অনুভূত মানের চেয়ে বড় জাম্প টেবিল তৈরি করা যেতে পারে, যা অত্যন্ত দক্ষ।

  • যদি এই সেটটি খুব ঘন না হয় তবে এন> = β, একটি বাইনারি অনুসন্ধান গাছ ও (2 * লগ (এন)) এ লক্ষ্য খুঁজে পেতে পারে যা এখনও কার্যকর।

অন্যান্য সমস্ত ক্ষেত্রে, যদি / অন্য বিবৃতিগুলির সমতুল্য সিরিজের মতো একটি স্যুইচ বিবৃতি ঠিক তত দক্ষ। Α এবং β এর সুনির্দিষ্ট মানগুলি বিভিন্ন কারণের উপর নির্ভর করে এবং সংকলকের কোড-অপ্টিমাইজেশন মডিউল দ্বারা নির্ধারিত হয়।

অবশেষে অবশ্যই, যদি এর ডোমেনটি <condition>পূর্ণসংখ্যার হয় না, একটি স্যুইচ বিবৃতি সম্পূর্ণ অকেজো।


+1 টি। নেটওয়ার্ক I / O- তে ব্যয় করা সময়টি এই বিশেষ সমস্যাটি সহজেই গ্রহ করছে good
অ্যাডাম পেইন্টার

3
এটি লক্ষ করা উচিত যে স্যুইচগুলি কেবল ইনটগুলির চেয়ে বেশি কাজ করে। জাভা টিউটোরিয়ালগুলি থেকে: "একটি স্যুইচ বাইট, শর্ট, চর এবং ইনট প্রিমিটিভ ডেটা টাইপগুলির সাথে কাজ করে It : চরিত্র, বাইট, সংক্ষিপ্ত এবং পূর্ণসংখ্যা (নম্বর এবং স্ট্রিংগুলিতে আলোচিত)। স্ট্রিংয়ের জন্য সমর্থন আরও সাম্প্রতিক সংযোজন; জাভা in-এ
জাভাস /

1
@ jhonFeminella আপনি দয়া করে জাভা 7 স্ট্রিংয়ের সুইটচ স্ট্রিংয়ের সাথে / অন্যথায় যদি স্ট্রিংয়ের সাথে তুলনা করে বিগ ও ধারণা প্রভাবগুলি তুলনা করতে পারেন ..?
কানগাভেলু সুগুমার

আরো সঠিকভাবে, javac 8 স্থান জটিলতা সময়ের জটিলতা 3 ওজন দেয়: stackoverflow.com/a/31032054/895245
সিরো Santilli郝海东冠状病六四事件法轮功

11

সুইচ ব্যবহার করুন!

আমি অন্যথায়-ব্লক বজায় রাখতে ঘৃণা করি! একটি পরীক্ষা আছে:

public class SpeedTestSwitch
{
    private static void do1(int loop)
    {
        int temp = 0;
        for (; loop > 0; --loop)
        {
            int r = (int) (Math.random() * 10);
            switch (r)
            {
                case 0:
                    temp = 9;
                    break;
                case 1:
                    temp = 8;
                    break;
                case 2:
                    temp = 7;
                    break;
                case 3:
                    temp = 6;
                    break;
                case 4:
                    temp = 5;
                    break;
                case 5:
                    temp = 4;
                    break;
                case 6:
                    temp = 3;
                    break;
                case 7:
                    temp = 2;
                    break;
                case 8:
                    temp = 1;
                    break;
                case 9:
                    temp = 0;
                    break;
            }
        }
        System.out.println("ignore: " + temp);
    }

    private static void do2(int loop)
    {
        int temp = 0;
        for (; loop > 0; --loop)
        {
            int r = (int) (Math.random() * 10);
            if (r == 0)
                temp = 9;
            else
                if (r == 1)
                    temp = 8;
                else
                    if (r == 2)
                        temp = 7;
                    else
                        if (r == 3)
                            temp = 6;
                        else
                            if (r == 4)
                                temp = 5;
                            else
                                if (r == 5)
                                    temp = 4;
                                else
                                    if (r == 6)
                                        temp = 3;
                                    else
                                        if (r == 7)
                                            temp = 2;
                                        else
                                            if (r == 8)
                                                temp = 1;
                                            else
                                                if (r == 9)
                                                    temp = 0;
        }
        System.out.println("ignore: " + temp);
    }

    public static void main(String[] args)
    {
        long time;
        int loop = 1 * 100 * 1000 * 1000;
        System.out.println("warming up...");
        do1(loop / 100);
        do2(loop / 100);

        System.out.println("start");

        // run 1
        System.out.println("switch:");
        time = System.currentTimeMillis();
        do1(loop);
        System.out.println(" -> time needed: " + (System.currentTimeMillis() - time));

        // run 2
        System.out.println("if/else:");
        time = System.currentTimeMillis();
        do2(loop);
        System.out.println(" -> time needed: " + (System.currentTimeMillis() - time));
    }
}

বেঞ্চমার্কিংয়ের জন্য আমার সি # স্ট্যান্ডার্ড কোড


আপনি কীভাবে দয়া করে (কোনও কোনও সময়) কিছুটা বিশদভাবে বর্ণনা করতে পারেন যে আপনি এটি কীভাবে বেনমার্ক করেছিলেন?
DerMike

আপনার আপডেটের জন্য আপনাকে অনেক ধন্যবাদ। আমি বলতে চাইছি, তারা এক মাত্রার এক ক্রম দ্বারা পৃথক - যা অবশ্যই সম্ভব। আপনি কি নিশ্চিত যে সংকলকটি কেবল এসকে অপ্টিমাইজ করে নি switch?
DerMike

@ ডারমাইক আমার মনে নেই আমি কীভাবে পুরানো ফলাফল পেয়েছি। আমি আজ খুব আলাদা পেয়েছি। তবে এটি নিজে চেষ্টা করে দেখুন এবং কীভাবে এটি সক্রিয় হয় তা আমাকে জানান।
বিটারব্লিউ

1
যখন আমি এটি আমার ল্যাপটপে চালাই; স্যুইচ সময় প্রয়োজন: 3585, যদি / অন্য সময় প্রয়োজন: 3458 তাই / অন্যথায় ভাল হয় :) না আরও খারাপ
হালাল

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

8

আমার মনে আছে জাভা বাইটকোডে 2 ধরণের স্যুইচ স্টেটমেন্ট রয়েছে reading (আমি মনে করি এটি 'জাভা পারফরম্যান্স টিউনিং'-এ ছিল একটি খুব দ্রুত বাস্তবায়ন যা কোডটির অফসেট কার্যকর করতে হবে তা জানার জন্য স্যুইচ স্টেটমেন্টের পূর্ণসংখ্যার মানগুলি ব্যবহার করে This এটির জন্য সমস্ত সংখ্যার ধারাবাহিকভাবে এবং একটি সু-সংজ্ঞায়িত পরিসরে প্রয়োজন আমি অনুমান করছি যে এনুমের সমস্ত মান ব্যবহার করাও সেই বিভাগে আসবে।

যদিও আমি অন্য অনেক পোস্টারের সাথে একমত হই ... যদিও এটি খুব গরম কোড না হলে এটি নিয়ে চিন্তিত হওয়া অকাল হতে পারে।


4
হট কোড মন্তব্যের জন্য +1। এটি যদি আপনার মূল লুপে থাকে তবে এটি অকাল নয়।
কিংঅ্যান্ড্রু

হ্যাঁ, জাভ্যাকswitch বিভিন্ন উপায়ে কার্যকর করে, কিছু অন্যদের চেয়ে আরও কার্যকর। সাধারণভাবে, দক্ষতা একটি সরাসরি-ফরোয়ার্ড " ifমই" এর চেয়ে খারাপ আর হবে না , তবে পর্যাপ্ত প্রকরণ রয়েছে (বিশেষত জেআইটিসি-র সাথে) যে এর চেয়ে অনেক বেশি সুনির্দিষ্ট হওয়া শক্ত।
হট লিক্স

8

ক্লিফ তার ২০০৯ জাভা ওয়ান টক এ ক্র্যাশ কোর্স মডার্ন হার্ডওয়ারে ক্লিক করুন অনুসারে :

আজ, কর্মক্ষমতা মেমরি অ্যাক্সেসের নিদর্শনগুলির দ্বারা প্রাধান্য পেয়েছে। ক্যাশে আধিপত্য মিস করে - মেমরিটি নতুন ডিস্ক। [65৫ স্লাইড]

আপনি তার সম্পূর্ণ স্লাইড পেতে পারেন এখানে

ক্লিফ একটি উদাহরণ দেয় (স্লাইড 30 এ সমাপ্তি) দেখায় যে এমনকি সিপিইউ রেজিস্ট্রার-নামকরণ, শাখার পূর্বাভাস এবং অনুমানমূলক সম্পাদন করে, এটি কেবল দুটি ক্যাশে মিস হওয়ার কারণে অবরুদ্ধ হওয়ার আগে 4 ঘড়ির চক্রের 7 টি অপারেশন শুরু করতে সক্ষম ফিরে আসতে 300 ঘড়ির চক্র।

সুতরাং তিনি বলেছেন আপনার প্রোগ্রামটি গতি বাড়ানোর জন্য আপনি এই ধরণের ছোটখাটো সমস্যার দিকে নজর দেওয়া উচিত নয়, তবে বড় আকারে যেমন আপনি "এসওএপি → এক্সএমএল → ডোম → এসকিউএল conver রূপান্তর করার মতো অপ্রয়োজনীয় ডেটা ফর্ম্যাট রূপান্তর করছেন কিনা ... "যা" সমস্ত ডেটা ক্যাশে দিয়ে যায় "।


4

আমার পরীক্ষায় আরও ভাল পারফরম্যান্স হ'ল উইন্ডোজ 7এনএম> এমএপি> সুইচ> আইএফ / ইএলএসই আইএফ

import java.util.HashMap;
import java.util.Map;

public class StringsInSwitch {
public static void main(String[] args) {
    String doSomething = null;


    //METHOD_1 : SWITCH
    long start = System.currentTimeMillis();
    for (int i = 0; i < 99999999; i++) {
        String input = "Hello World" + (i & 0xF);

        switch (input) {
        case "Hello World0":
            doSomething = "Hello World0";
            break;
        case "Hello World1":
            doSomething = "Hello World0";
            break;
        case "Hello World2":
            doSomething = "Hello World0";
            break;
        case "Hello World3":
            doSomething = "Hello World0";
            break;
        case "Hello World4":
            doSomething = "Hello World0";
            break;
        case "Hello World5":
            doSomething = "Hello World0";
            break;
        case "Hello World6":
            doSomething = "Hello World0";
            break;
        case "Hello World7":
            doSomething = "Hello World0";
            break;
        case "Hello World8":
            doSomething = "Hello World0";
            break;
        case "Hello World9":
            doSomething = "Hello World0";
            break;
        case "Hello World10":
            doSomething = "Hello World0";
            break;
        case "Hello World11":
            doSomething = "Hello World0";
            break;
        case "Hello World12":
            doSomething = "Hello World0";
            break;
        case "Hello World13":
            doSomething = "Hello World0";
            break;
        case "Hello World14":
            doSomething = "Hello World0";
            break;
        case "Hello World15":
            doSomething = "Hello World0";
            break;
        }
    }

    System.out.println("Time taken for String in Switch :"+ (System.currentTimeMillis() - start));




    //METHOD_2 : IF/ELSE IF
    start = System.currentTimeMillis();

    for (int i = 0; i < 99999999; i++) {
        String input = "Hello World" + (i & 0xF);

        if(input.equals("Hello World0")){
            doSomething = "Hello World0";
        } else if(input.equals("Hello World1")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World2")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World3")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World4")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World5")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World6")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World7")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World8")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World9")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World10")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World11")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World12")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World13")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World14")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World15")){
            doSomething = "Hello World0";

        }
    }
    System.out.println("Time taken for String in if/else if :"+ (System.currentTimeMillis() - start));









    //METHOD_3 : MAP
    //Create and build Map
    Map<String, ExecutableClass> map = new HashMap<String, ExecutableClass>();
    for (int i = 0; i <= 15; i++) {
        String input = "Hello World" + (i & 0xF);
        map.put(input, new ExecutableClass(){
                            public void execute(String doSomething){
                                doSomething = "Hello World0";
                            }
                        });
    }


    //Start test map
    start = System.currentTimeMillis();
    for (int i = 0; i < 99999999; i++) {
        String input = "Hello World" + (i & 0xF);
        map.get(input).execute(doSomething);
    }
    System.out.println("Time taken for String in Map :"+ (System.currentTimeMillis() - start));






    //METHOD_4 : ENUM (This doesn't use muliple string with space.)
    start = System.currentTimeMillis();
    for (int i = 0; i < 99999999; i++) {
        String input = "HW" + (i & 0xF);
        HelloWorld.valueOf(input).execute(doSomething);
    }
    System.out.println("Time taken for String in ENUM :"+ (System.currentTimeMillis() - start));


    }

}

interface ExecutableClass
{
    public void execute(String doSomething);
}



// Enum version
enum HelloWorld {
    HW0("Hello World0"), HW1("Hello World1"), HW2("Hello World2"), HW3(
            "Hello World3"), HW4("Hello World4"), HW5("Hello World5"), HW6(
            "Hello World6"), HW7("Hello World7"), HW8("Hello World8"), HW9(
            "Hello World9"), HW10("Hello World10"), HW11("Hello World11"), HW12(
            "Hello World12"), HW13("Hello World13"), HW14("Hello World4"), HW15(
            "Hello World15");

    private String name = null;

    private HelloWorld(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void execute(String doSomething){
        doSomething = "Hello World0";
    }

    public static HelloWorld fromString(String input) {
        for (HelloWorld hw : HelloWorld.values()) {
            if (input.equals(hw.getName())) {
                return hw;
            }
        }
        return null;
    }

}





//Enum version for betterment on coding format compare to interface ExecutableClass
enum HelloWorld1 {
    HW0("Hello World0") {   
        public void execute(String doSomething){
            doSomething = "Hello World0";
        }
    }, 
    HW1("Hello World1"){    
        public void execute(String doSomething){
            doSomething = "Hello World0";
        }
    };
    private String name = null;

    private HelloWorld1(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void execute(String doSomething){
    //  super call, nothing here
    }
}


/*
 * http://stackoverflow.com/questions/338206/why-cant-i-switch-on-a-string
 * https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.10
 * http://forums.xkcd.com/viewtopic.php?f=11&t=33524
 */ 

Time taken for String in Switch :3235 Time taken for String in if/else if :3143 Time taken for String in Map :4194 Time taken for String in ENUM :2866
হালিল

@ যদিও এই কোডটি বিভিন্ন পরিবেশে কীভাবে কাজ করে তা আমি নিশ্চিত নই, তবে আপনি উল্লেখ করেছেন যে / / অন্য স্যুইচ এবং মানচিত্রের চেয়ে ভাল হলে আমি নিশ্চিত হতে পারছি না যেহেতু / অন্যটি যদি তুলনার সমান হয় না তবে।
কানগাভেলু সুগুমার 20'15

2

সর্বাধিক switchএবং বেশিরভাগ if-then-elseব্লকের জন্য, আমি কল্পনা করতে পারি না যে কোনও প্রশংসনীয় বা উল্লেখযোগ্য পারফরম্যান্স সম্পর্কিত উদ্বেগ রয়েছে।

তবে এখানে জিনিসটি রয়েছে: আপনি যদি কোনও switchব্লক ব্যবহার করেন তবে এর ব্যবহারের সাহায্যে বোঝা যায় যে আপনি সংকলনের সময় পরিচিত ধ্রুবকের সেট থেকে নেওয়া কোনও মান স্যুইচ করছেন। এই ক্ষেত্রে, আপনি switchযদি একটি ব্যবহার করতে পারেন তবে আপনার সত্যই বিবৃতি ব্যবহার করা উচিত নয়enum ধ্রুবক-নির্দিষ্ট পদ্ধতি ।

একটি switchবিবৃতি তুলনায় , একটি এনাম আরও ভাল প্রকারের সুরক্ষা এবং কোড সরবরাহ করে যা বজায় রাখা সহজ। এনামগুলি এমনভাবে নকশা করা যেতে পারে যাতে ধ্রুবকের সেটগুলিতে যদি একটি ধ্রুবক যুক্ত করা হয় তবে নতুন কোডের জন্য ধ্রুবক-নির্দিষ্ট পদ্ধতি সরবরাহ না করে আপনার কোডটি সংকলন করবে না। অন্যদিকে, caseকোনও switchব্লকে নতুন যুক্ত করতে ভুলে যাওয়া কখনও কখনও রান টাইমে ধরা পড়তে পারে যদি আপনি যথেষ্ট ভাগ্যবান হন তবে ব্যতিক্রম ছুঁড়ে দেওয়ার জন্য আপনার ব্লকটি সেট আপ করতে পারেন।

switchএকটি enumধ্রুবক-নির্দিষ্ট পদ্ধতির মধ্যে পারফরম্যান্স উল্লেখযোগ্যভাবে আলাদা হওয়া উচিত নয়, তবে পরবর্তীটি আরও পাঠযোগ্য, নিরাপদ এবং বজায় রাখা সহজ।

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