জাভাস্ক্রিপ্ট স্যুইচ বনাম। যদি… অন্যথায় যদি… অন্যথায় হয়


143

বলছি আমার কয়েকটি প্রশ্ন আছে:

  1. একটি switchবিবৃতি এবং একটি মধ্যে জাভাস্ক্রিপ্ট একটি পারফরম্যান্স পার্থক্য আছে if...else?
  2. যদি তাই হয় কেন?
  3. ব্রাউজার জুড়ে switchএবং এর আচরণ কি if...elseআলাদা? (ফায়ারফক্স, আইই, ক্রোম, অপেরা, সাফারি)

এই প্রশ্নটি জিজ্ঞাসা করার কারণটি দেখে মনে হচ্ছে যে switchফায়ারফক্সে আনুমানিক মোট মামলার একটি বিবৃতিতে আমি আরও ভাল পারফরম্যান্স পাচ্ছি ।


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

CreateConditionals(string name, string arrayofvalues, string arrayofActions)

নোট arrayofvaluesএকটি কমা দ্বারা পৃথক তালিকা।

এটি যা উত্পাদন করে তা হ'ল

function [name] (value) {
  if (value == [value from array index x]) {
     [action from array index x]
  }
}

দ্রষ্টব্য: যেখানে [name]= সার্ভারসাইড ফাংশনে নামটি প্রবেশ করেছে

এখন আমি ফাংশনের আউটপুটটিকে একটি টেক্সটআরিয়ায় sertedোকানোর জন্য পরিবর্তন করেছি, ফাংশনটির মাধ্যমে পার্স করার জন্য কিছু জাভাস্ক্রিপ্ট কোড লিখেছি এবং এটির সেটগুলিতে রূপান্তর করেছি case বিবৃতিতে ।

অবশেষে আমি ফাংশনটি পরিচালনা করি এবং এটি সূক্ষ্মভাবে চালিত হয় তবে IE এবং ফায়ারফক্সে পারফরম্যান্সের পার্থক্য রয়েছে।


1
আমি সর্বোত্তম কী তা পরীক্ষা করতে একটি কোড নমুনা প্রস্তাব করব। আমি বোঝাতে চাইছি, এর কারণ হওয়ার দরকার নেই কেন?
jcolebrand

আপনি যা করছেন তা দয়া করে পোস্ট করুন, কারণ আমার দীর্ঘ অভিজ্ঞতায় খুব কম কেস রয়েছে যার জন্য আমি 100-কেস সুইচ স্টেটমেন্ট বা / 100 সিরিজটি যদি ভাল ধারণা হত তবে 100-ভাগ বলতাম।
পয়েন্টি

দুঃখিত ছেলেরা 100s নয় হাজার হাজার শর্ত
জন হার্টসক

2
সবাই, ইনপুট জন্য ধন্যবাদ। তবে আমার সমস্যাটি আসলে এবং যদি স্টিথ স্ট্যাটাসের মধ্যে পার্থক্য না করে। এটি কোডটি ছিল স্টেটমেন্টের অভ্যন্তরে। আপনার সাহায্যের জন্য আপনার সকলকে +1 করুন। অসুবিধার জন্য দুঃখিত কখনও কখনও সমাধান খুঁজে পেতে আপনার অন্য ব্যক্তির সাথে কথা বলতে হবে।
জন হার্টসক

উত্তর:


113

সাধারণতায় জবাব দেওয়া:

  1. হ্যাঁ, সাধারণত
  2. এখানে আরও তথ্য দেখুন
  3. হ্যাঁ, কারণ প্রত্যেকের আলাদা আলাদা জেএস প্রসেসিং ইঞ্জিন রয়েছে, তবে নীচের সাইটে কোনও পরীক্ষা চালানোর সময়, সুইচটি সর্বদা আউটপুটটি সম্পাদন করে, অন্যথায় যদি প্রচুর পরিমাণে পুনরাবৃত্তি হয়।

পরীক্ষার সাইট


1
আপনি যদি কোন শর্তসাপেক্ষে এখানে কখন টিএমডিআর ব্যবহার করতে চান তা নিবন্ধের একটি বিভাগের সরাসরি লিঙ্ক যা এতে সম্বোধন করা হচ্ছে: oreilly.com/server-administration/excerpts/even-faster-websites/…
এজেডস

2
@ টমি ভাল নিবন্ধ, ভাগ করে নেওয়ার জন্য ধন্যবাদ। তবে নিবন্ধে বলা হয়েছে যে জেএসে বিবৃতি switchএবং if/thenবিবৃতিগুলির মধ্যে একটি তুচ্ছ পারফরম্যান্স পার্থক্য রয়েছে । নিবন্ধটি বলেছে যে এটি স্পটিটি switchঅপ্টিমাইজেশনের কারণে এবং বিভিন্ন উপায়ে জেএস ইঞ্জিনগুলির বিভিন্ন উপায়ে কাজ করে। উদ্ধৃতি:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
জ্যাস্পার

3
এই বর্ণনায় পরিমাণযুক্ত কিছু দেখানো হয়েছে কি? এটি প্রচুর "সেরা অনুশীলন / অকাল অপ্টিমাইজেশন" অনুমানের মতো পড়ে। এটি 7 বছর আগেও লেখা হয়েছিল, সুতরাং জাভাস্ক্রিপ্ট অপ্টিমাইজেশানগুলি এই সময়ের মধ্যে দুর্দান্ত পরিবর্তন হয়েছে। সংকলিত ভাষায়, এই তিনটি ক্রিয়াকলাপের মধ্যে পারফরম্যান্সের পার্থক্যটি "যত্ন নেওয়ার পক্ষে প্রায় যথেষ্ট তাৎপর্যপূর্ণ নয়"। আসল কার্যকারিতা প্রভাবিত করবে না এমন জিনিসগুলিকে অনুকূল করে তুলবেন না। পঠনযোগ্যতা অনুকূল।
থমসন কমার 21

3
@ টমি Here এখানে আরও তথ্য দেখুন 40 404 দেয়, সেখানে কী ছিল?
লজিকডেমন

2
@ লোগিকডিমন - আইআইআরসি হ'ল কিছু ওরিলি পাঠ্যবক্সের একটি লিঙ্ক যা কিছু জেএস পারফরম্যান্স বিবেচনার / আলোচনার মধ্যে পড়েছিল
টমি

61

কখনও কখনও এটি না ব্যবহার করা ভাল। উদাহরণস্বরূপ, "প্রেরণ" পরিস্থিতিতে জাভাস্ক্রিপ্ট আপনাকে সম্পূর্ণ ভিন্ন উপায়ে কাজ করতে দেয়:

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}

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

একটি "কেস" এর সমতুল্য হওয়ার জন্য একটি ফাংশন কলের যোগ করা ওভারহেড রয়েছে, তবে কোনও বিশেষ কীটির জন্য ফাংশনটি সন্ধান করার জন্য হ্যাশ অনুসন্ধানের সুবিধা (যখন প্রচুর কেস থাকে) advantage


2
আপনার কৌশলটি ভাল এবং আমি প্রায়শই এটি ব্যবহার করি। তবে @ মিশেল জেরি স্ট্যাকওভারফ্লো. com / a / 45336805 / 5936119 দ্বারা নির্দেশিত হিসাবে , মানচিত্রের পরিবর্তনশীল প্রেরণের প্রসঙ্গে বাইরে ঘোষণা করতে হবে অন্যথায় এটি সর্বদা পুনরায় মূল্যায়ন করা হবে।
ড্যানিয়েল সান্টানা

@ ড্যানিয়েলসন্তানা সত্য তবে আমি সন্দেহ করি যে এটি ব্যয়বহুল। বিশেষত, একবার কোনও ফাংশন শুরুর পরে কোডটি নিজেই পুনঃজেনার প্রয়োজন হয় না, কারণ পাঠ্যটি স্থির থাকে।
পয়েন্টি

18

একটি switchএবং এর মধ্যে পারফরম্যান্সের পার্থক্যটি if...else if...elseছোট, তারা মূলত একই কাজ করে। তাদের মধ্যে একটি পার্থক্য যা পার্থক্য তৈরি করতে পারে তা হ'ল পরীক্ষার এক্সপ্রেশনটি কেবলমাত্র একবারের switchজন্য প্রতিটিটির জন্য মূল্যায়ন করা হয় if। যদি অভিব্যক্তিটি মূল্যায়ন করা ব্যয়বহুল হয় তবে এটি একবার করে করা একশ বার করার চেয়ে অবশ্যই দ্রুত।

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

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


7
  1. যদি কোনও পার্থক্য থাকে তবে এটি কখনই লক্ষ্য করা যায় না large
  2. এন / এ
  3. না, তারা সকলেই অভিন্নভাবে কাজ করে।

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


5
বিশেষত জাভাস্ক্রিপ্টে, শব্দার্থবিজ্ঞান এবং পাঠযোগ্যতা (এবং তাই রক্ষণাবেক্ষণযোগ্যতা) কোনও অনন্য ব্রাউজার সংস্করণ কম্পিউটার হার্ডওয়্যার এবং ওএস সংমিশ্রনের কারণে if..elseএবং এর switchকারণে স্থানীয়করণের কোনও পারফরম্যান্সের পার্থক্যকে ট্রাম্প করে ।
jball

2
আমি সম্মত কিনা জানি না, এটি অবশ্যই লক্ষ্য করা যেতে পারে যে এটি কোনও লুপে, একটি বৃহত ডাটাবেস, গাছের
সন্ধানে ব্যবহৃত হয়

2
আমি অবশ্যই একমত। ওয়েব অ্যাপ্লিকেশনগুলি আরও জটিল হয়ে উঠার সাথে সাথে এই পার্থক্যটি অ্যাপ্লিকেশনটির জন্য তাৎপর্যপূর্ণ হতে পারে এবং ব্রাউজারগুলির উপর নির্ভরশীল পরিবর্তন করতে পারে।
joshvermaire

7
গুরুত্বপূর্ণ বিষয় হ'ল পরিষ্কার, রক্ষণাবেক্ষণযোগ্য কোড লিখুন। যখন কোনও পারফরম্যান্সের সমস্যা দেখা যায় - প্রোফাইল। তারপরে কোন কোডটি ঠিক করতে হবে তা নির্ধারণ করুন। ধরে নেওয়া পারফরম্যান্স সমস্যার জন্য রক্ষণাবেক্ষণের ত্যাগ করবেন না।
জন বেনেডিক্টো

3
'অন্যথায় যদি ...' ও (এন) হয়, অন্যদিকে 'সুইচ' হয় ও (1) বা ও (লগ (এন)) হয়। আপনি কীভাবে সততার সাথে বলতে পারেন যে পার্থক্যটি কখনই যথেষ্ট পরিমাণে বড় হতে পারে না? এক মিলিয়ন কেস স্যুইচ করুন (কোডটি উত্পন্ন হলে সহজেই সম্ভব হয়) এবং আপনি অবশ্যই এটি ন্যূনতম বলার জন্য লক্ষ্য করবেন।
ড্রাগনরুট

6

সিনট্যাক্স ব্যতীত, একটি গাছ ব্যবহার করে একটি স্যুইচ প্রয়োগ করা যেতে পারে যা এটি তৈরি করে O(log n), অন্যথায় যদি / অন্য কোনও O(n)পদ্ধতিগত পদ্ধতির সাথে প্রয়োগ করতে হয় । প্রায়শই তারা উভয় প্রক্রিয়াগতভাবে প্রক্রিয়াজাত হয় এবং কেবলমাত্র পার্থক্যটি সিনট্যাক্স হয় এবং তবুও এটি সত্যই গুরুত্বপূর্ণ হয় না - যদি আপনি স্থিতভাবে 10k কেস টাইপ করেন / যদি অন্যভাবে হয়?


Years বছর পরে ... আমি দেখতে পাচ্ছি না গাছের প্রয়োগ কীভাবে সম্ভব হয়, ধ্রুবক সংখ্যাসূচক ক্ষেত্রে মানগুলির ক্ষেত্রে বাদে)।
এড স্টাব

4

পয়েন্টির উত্তরটিswitch বা if/ এর বিকল্প হিসাবে কোনও বস্তুর আক্ষরিক ব্যবহারের পরামর্শ দেয় else। আমি এই পদ্ধতিটিও পছন্দ করি, তবে উত্তরে কোডটি mapপ্রতিবার dispatchফাংশনটি বলা হওয়ার সময় একটি নতুন অবজেক্ট তৈরি করে :

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}

যদি mapপ্রচুর পরিমাণে এন্ট্রি থাকে তবে এটি উল্লেখযোগ্য ওভারহেড তৈরি করতে পারে। অ্যাকশন মানচিত্রটি একবারে সেট আপ করা এবং তারপরে প্রতিবার ইতিমধ্যে তৈরি করা মানচিত্র ব্যবহার করা ভাল example

var actions = {
    'explode': function() {
        prepExplosive();
        if( flammable() ) issueWarning();
        doExplode();
    },

    'hibernate': function() {
        if( status() == 'sleeping' ) return;
        // ... I can't keep making this stuff up
    },
    // ...
};

function dispatch( name ) {
    var action = actions[name];
    if( action ) action();
}

3

একটি সুইচ স্টেটমেন্ট এবং যদি একটি ... অন্যথায় যদি .... অন্যথায় জাভাস্ক্রিপ্ট মধ্যে একটি পারফরম্যান্স পার্থক্য আছে?

আমি মনে করি না, switchদরকারী / সংক্ষিপ্ত আপনি যদি একাধিক if-elseশর্ত প্রতিরোধ করতে চান ।

স্যুইচ এর আচরণ এবং যদি ... অন্যথায় ... ব্রাউজার জুড়ে অন্য কি আলাদা? (ফায়ারফক্স, আইই, ক্রোম, অপেরা, সাফারি)

আচরণ সমস্ত ব্রাউজার জুড়ে এক হয় :)


5
switch is useful/short if you want prevent multiple if-else conditions.হ্যাঁ স্যার, দুর্দান্ত পোস্ট।
নাইক নিউম্যান

1
  1. ওয়ার্কব্যাঞ্চিংয়ের ফলে কিছু ক্ষেত্রে খুব সামান্য পার্থক্য হতে পারে তবে প্রক্রিয়াজাতকরণের উপায় যাইহোক ব্রাউজার নির্ভর করে তাই বিরক্ত করার মতো নয়
  2. বিভিন্ন প্রক্রিয়াজাতকরণের কারণে
  3. যদি আচরণ কোনওভাবেই আলাদা হয় তবে আপনি এটিকে ব্রাউজার বলতে পারবেন না

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