আমি যখন অন্যান্য উত্তরের সমাধানগুলির দিকে তাকালাম তখন আমি এমন কিছু জিনিস দেখেছি যা আমি জানি যা পারফরম্যান্সের জন্য খারাপ। আমি তাদের একটি মন্তব্যে রাখতে যাচ্ছিলাম তবে আমি মনে করি এটির বেঞ্চমার্ক করা এবং ফলাফলগুলি ভাগ করে নেওয়া ভাল। আপনি নিজে এটি পরীক্ষা করতে পারেন । নীচে প্রতিটি ফলাফল (ymmv) প্রতিটি ব্রাউজারে দ্রুত অপারেশন করার পরে স্বাভাবিক করা হয়েছে (এমএসে পরম সময় পেতে স্বাভাবিক মানের সাথে 1.0 বারটি গুণ করুন)।
ক্রোম ফায়ারফক্স অপেরা এমএসআইই সাফারি নোড
-------------------------------------------------- -----------------
1.0 সময় 37ms 73ms 68ms 184ms 73ms 21ms
যদি-তাত্ক্ষণিক 1.0 1.0 1.0 2.6 1.0 1.0
if-indirect 1.2 1.8 3.3 3.8 2.6 1.0
সুইচ-তাত্ক্ষণিক 2.0 1.1 2.0 1.0 2.8 1.3
স্যুইচ-রেঞ্জ 38.1 10.6 2.6 7.3 20.9 10.4
স্যুইচ-রেঞ্জ 2 31.9 8.3 2.0 4.5 9.5 6.9
সুইচ-অপ্রত্যক্ষ-অ্যারে 35.2 9.6 4.2 5.5 10.7 8.6
অ্যারে-লিনিয়ার-স্যুইচ 3.6 4.1 4.5 10.0 4.7 2.7
অ্যারে-বাইনারি-স্যুইচ 7.8 6.7 9.5 16.0 15.0 4.9
টেস্ট যেখানে উইন্ডোজ 7 folowing সংস্করণের সাথে 32bit সম্পাদনা: ক্রোম 21.0.1180.89m , ফায়ারফক্স 15.0 , অপেরা 12,02 , MSIE 9.0.8112 , সাফারি 5.1.7 । নোডটি একটি লিনাক্স bit৪ বিট বাক্সে চালিত হয়েছিল কারণ উইন্ডোজের নোড.জেএস-তে টাইমার রেজোলিউশনটি 1 এমএসের পরিবর্তে 10 মিমি ছিল।
যদি-অবিলম্বে
এটি ... ড্রামরল এমএসআইই ব্যতীত সমস্ত পরীক্ষিত পরিবেশে সবচেয়ে দ্রুত ! (চমক চমক). এটি এটি প্রয়োগ করার প্রস্তাবিত উপায়।
if (val < 1000) { /*do something */ } else
if (val < 2000) { /*do something */ } else
...
if (val < 30000) { /*do something */ } else
যদি-পরোক্ষ
এই একটি বৈকল্পিক switch-indirect-arrayকিন্তু ifদ্রুত তুলনায় অনেক বদলে -statements এবং সঞ্চালিত switch-indirect-arrayপ্রায় সব পরীক্ষিত পরিবেশে।
values=[
1000, 2000, ... 30000
];
if (val < values[0]) { /* do something */ } else
if (val < values[1]) { /* do something */ } else
...
if (val < values[29]) { /* do something */ } else
সুইচ-অবিলম্বে
এটি সমস্ত পরীক্ষিত পরিবেশে বেশ দ্রুত এবং আসলে এমএসআইইতে সবচেয়ে দ্রুত। এটি কাজ করে যখন আপনি কোনও সূচক পাওয়ার জন্য কোনও গণনা করতে পারেন।
switch (Math.floor(val/1000)) {
case 0: /* do something */ break;
case 1: /* do something */ break;
...
case 29: /* do something */ break;
}
সুইচ পরিসরের
এটি অপেরা ব্যতীত সমস্ত পরীক্ষিত পরিবেশের দ্রুততম তুলনায় প্রায় 6 থেকে 40 গুণ ধীর, যেখানে প্রায় দেড় গুণ সময় লাগে takes এটি ধীরে ধীরে কারণ ইঞ্জিনকে প্রতিটি মামলার জন্য দুবারের মান তুলনা করতে হয়। আশ্চর্যজনকভাবে ক্রোমের দ্রুততম অপারেশনের তুলনায় ক্রোমটি এটি সম্পূর্ণ করতে প্রায় 40 গুণ বেশি সময় নেয়, যখন এমএসআইই কেবল 6 বার সময় নেয়। তবে আসল সময়ের পার্থক্যটি ছিল মাত্র ms 74 মিলিয়ন এমএসআইইর পক্ষে ১৩3737ms (!)।
switch (true) {
case (0 <= val && val < 1000): /* do something */ break;
case (1000 <= val && val < 2000): /* do something */ break;
...
case (29000 <= val && val < 30000): /* do something */ break;
}
সুইচ-ব্যাপ্তি 2
এটির একটি রূপ switch-rangeতবে প্রতি কেস কেবলমাত্র একটি তুলনা এবং অতএব দ্রুত, তবে অপেরা বাদে খুব ধীর। কেস স্টেটমেন্টের ক্রমটি গুরুত্বপূর্ণ কারণ ইঞ্জিন প্রতিটি ক্ষেত্রে উত্স কোড অর্ডারে ECMAScript262 পরীক্ষা করবে : 5 12.11
switch (true) {
case (val < 1000): /* do something */ break;
case (val < 2000): /* do something */ break;
...
case (val < 30000): /* do something */ break;
}
সুইচ-পরোক্ষ-বিন্যস্ত
এই রূপটিতে রেঞ্জগুলি একটি অ্যারেতে সংরক্ষণ করা হয়। এটি সমস্ত পরীক্ষিত পরিবেশে ধীর এবং Chrome এ খুব ধীর।
values=[1000, 2000 ... 29000, 30000];
switch(true) {
case (val < values[0]): /* do something */ break;
case (val < values[1]): /* do something */ break;
...
case (val < values[29]): /* do something */ break;
}
অ্যারে-রৈখিক-অনুসন্ধান
এটি একটি অ্যারের মানগুলির রৈখিক অনুসন্ধান এবং স্থির মানগুলির সাথে স্যুইচ বিবৃতি সংমিশ্রণ। যখন কেউ এটি ব্যবহার করতে পারে তার কারণ হ'ল যখন রানটাইম পর্যন্ত মানগুলি জানা যায় না। এটি প্রতিটি পরীক্ষিত পরিবেশে ধীর এবং এমএসআইইতে প্রায় 10 গুণ সময় নেয়।
values=[1000, 2000 ... 29000, 30000];
for (sidx=0, slen=values.length; sidx < slen; ++sidx) {
if (val < values[sidx]) break;
}
switch (sidx) {
case 0: /* do something */ break;
case 1: /* do something */ break;
...
case 29: /* do something */ break;
}
অ্যারে-বাইনারি-সুইচ
এটি array-linear-switchবাইনারি অনুসন্ধানের সাথে পরিবর্তিত। দুর্ভাগ্যক্রমে এটি লিনিয়ার অনুসন্ধানের চেয়ে ধীর। আমি জানি না এটি আমার বাস্তবায়ন কিনা বা লিনিয়ার অনুসন্ধানটি আরও অনুকূলিত হয় কিনা। এটিও হতে পারে যে কী স্পেসটি ছোট।
values=[0, 1000, 2000 ... 29000, 30000];
while(range) {
range = Math.floor( (smax - smin) / 2 );
sidx = smin + range;
if ( val < values[sidx] ) { smax = sidx; } else { smin = sidx; }
}
switch (sidx) {
case 0: /* do something */ break;
...
case 29: /* do something */ break;
}
উপসংহার
কর্মক্ষমতা যদি গুরুত্বপূর্ণ হয় তবে ifস্টেস্টমেন্ট বা switchতাত্ক্ষণিক মান সহ ব্যবহার করুন ।