জাভাস্ক্রিপ্টে একটি অ্যারের মাধ্যমে লুপ করার দ্রুততম কোনটি?


248

আমি বইগুলি থেকে শিখেছি যে আপনি যেমন লুপ জন্য লিখতে হবে should

for(var i=0, len=arr.length; i < len; i++){
    // blah blah
}

সুতরাং arr.lengthপ্রতিবার গণনা করা হবে না।

অন্যরা বলে যে সংকলকটি এতে কিছুটা অপ্টিমাইজেশন করবে, তাই আপনি কেবল লিখতে পারেন:

for(var i=0; i < arr.length; i++){
    // blah blah
}

আমি কেবল জানতে চাই যে অনুশীলনের সর্বোত্তম উপায় কোনটি?


1
অ্যারে লুপিংয়ের সাথে ডিল করার সময় নজর রাখার মতো মূল্য রয়েছে: jsperf.com/array-loop-var-caching
ক্লকেনডিনজাস

ব্রাউজারডিয়েট থেকে @ wong2 তম এই বেঞ্চমার্কে বিকল্পের আরও সম্পূর্ণ সংগ্রহ রয়েছে।
ডমি


পূর্ববর্তী jsben- তে উন্নত: jsben.ch/#/R6LbS
কর্বফোন

আমরা কি for ... ofএই প্রতিযোগিতার লুপটি পরিচয় করিয়ে দিতে পারি ? সিনট্যাক্সটি আরও সহজ মনে হয় তবে ক্যাশে ছাড়াই লুপের জন্য একটি এবং আমি জানতে চাই যে আমার লুপগুলি ব্যবহারে স্যুইচ করা উচিত কিনা।
প্রোগ্রামাররাজ

উত্তর:


339

বেশিরভাগ আধুনিক ব্রাউজারের সাথে এই পরীক্ষাটি সম্পাদন করার পরে ...

http://jsben.ch/dyM52

বর্তমানে লুপের দ্রুততম রূপ (এবং আমার মতে সর্বাধিক সিনট্যাক্টিক্যালি সুস্পষ্ট)।

দৈর্ঘ্য ক্যাচিংয়ের সাথে লুপের জন্য একটি মান

for (var i = 0, len = myArray.length; i < len; i++) {

}

আমি বলব এটি অবশ্যই এমন একটি মামলা যেখানে আমি জাভাস্ক্রিপ্ট ইঞ্জিন বিকাশকারীদের প্রশংসা করি। চালুর সময় নয় , স্পষ্টতার জন্য একটি রান সময়কে অনুকূলিত করা উচিত ।


6
মজার বিষয় হল, আইই 9-তে এটি দ্রুততর: এর জন্য (var i = 0, len = myArray.length; i <len; ++ i) f} // উপসর্গ, পোস্টফিক্সের পরিবর্তে
ক্রিস্টোফার বেনেজ


4
আমি @ বেনিটএমসিএলওয়ের পরামর্শ অনুসারে প্রিফিক্স অপারেটরটি ব্যবহার করে পরীক্ষা করেছি এবং এটি কিছুটা দ্রুত গতিতে চলেছে : jsperf.com/caching-array-leight/84for(var i=0, len=myArray.length; i<len; ++i) পরীক্ষা করুন
22:33 '

21
আপনাকে এই লুপটি ব্যবহারে সতর্ক থাকতে হবে। আমি এটি ব্যবহার শুরু করেছিলাম এবং আমার একটি ভুলের কারণে বাগটি ট্র্যাক করা শক্ত হয়েছিল। আপনি যদি দুটি লুপ এর মতো নীড় করে থাকেন: jsfiddle.net/KQwmL/1 । দুটি লুপগুলিতে ভের লেনটির নাম আলাদা করতে আপনাকে সতর্ক থাকতে হবে, অন্যথায় দ্বিতীয় লুপটি প্রথম লেনটি ওভাররাইট করবে।
রুই মার্কস

6
@ উইলশাউমিডিয়া আপনি একক varবিবৃতি দিয়ে একাধিক ভেরিয়েবল ঘোষণা করতে পারেন । এটি কীভাবে লিখিত হয়, lenআপনার পরামর্শ অনুসারে আসলে স্কোপড।
jondavidjohn

90

একটি জাভাস্ক্রিপ্ট অ্যারে মাধ্যমে লুপ করার পরম দ্রুততম উপায়:

var len = arr.length;
while (len--) {
    // blah blah
}

সম্পূর্ণ তুলনার জন্য http://blogs.oracle.com/greimer/entry/best_way_to_code_a দেখুন


1
ব্যবহার করতে ভুলবেন না var(অন্যথায় lenএকটি বৈশ্বিক পরিবর্তনশীল হয়ে ওঠে)। এছাড়াও, আরও লুপ বেঞ্চমার্কের জন্য jsperf.com/loops দেখুন।
ম্যাথিয়াস বাইনেস

22
এই উত্তরটির উপর ভিত্তি করে তৈরি ব্লগ পোস্টটি এখন প্রায় 4 বছরের পুরানো, এবং সেই সময়ের জেএস ইঞ্জিনগুলিতে অনেক কিছু পরিবর্তিত হয়েছে, আপডেটের তুলনার জন্য নীচে আমার উত্তরটি দেখুন।
jondavidjohn

1
আমি @ জন্ডাভিডজহনের সাথে একমত আমি এই কোডটি পরীক্ষা করেছি এবং এটি কম দক্ষ হিসাবে দেখা গেছে ... jsperf.com
casing-

উপরের উত্তরটি প্রায় সর্বজনীন (ব্রাউজার জুড়ে) একটি ফর-লুপের চেয়ে অনেক ধীর। গৃহীত উত্তরে জেএসপিফার লিঙ্কটি দেখুন। এটি অত্যন্ত লজ্জাজনক, কারণ এটি অত্যন্ত পঠনযোগ্য আইএমও।
লেথারিয়ন

3
আমি @ জন্ডাভিডজহান অনুমান করছি যে আপনি 'আমার উত্তর নীচে' বলতে যা বোঝায় তা হ'ল 'উপরে আমার উত্তর' লল।
শানিমাল

39

জুন ২০১ 2016 পর্যন্ত সাম্প্রতিক ক্রোমে কিছু পরীক্ষা করা (মে ২০১ in এর ব্রাউজারের বাজারের %১%, এবং বাড়ছে):

  • দ্রুততম লুপটি লুপের জন্য , যা উভয়ই একই ধরণের পারফরম্যান্স সরবরাহ করে দৈর্ঘ্যের সাথে ক্যাচিং করে without (ক্যাশেড দৈর্ঘ্যের সাথে লুপের জন্য মাঝে মাঝে ক্যাশে ছাড়াই একের চেয়ে ভাল ফলাফল দেওয়া হয় তবে পার্থক্যটি প্রায় নগণ্য) যার অর্থ ইঞ্জিনটি ইতিমধ্যে মানটির পক্ষে উপযুক্ত হতে পারে এবং সম্ভবত ক্যাশে ছাড়াই লুপের জন্য সবচেয়ে সোজা হয়ে যেতে পারে।
  • হ্রাস সহ লুপটি লুপের জন্য প্রায় 1.5 গুণ ধীর ছিল।
  • কলব্যাক ফাংশন (যেমন প্রতিটি স্ট্যান্ডার্ডের মতো) ব্যবহার করে একটি লুপ লুপের চেয়ে প্রায় 10 গুণ কম ধীর ছিল।

আমি বিশ্বাস করি যে এই থ্রেডটি অনেক পুরানো এবং প্রোগ্রামাররা তাদের দৈর্ঘ্য ক্যাশে করার প্রয়োজন বলে মনে করতে ভ্রান্ত করছে, বা আরও ভাল পারফরম্যান্স অর্জনের জন্য হ্রাস সহ বিপরীত ট্র্যাভার্সিংয়ের সময় ব্যবহার করবে, এমন লিখন কোড যা লুপের জন্য সরল সরলতমের চেয়ে কম স্পষ্ট এবং ত্রুটির প্রবণতাযুক্ত writing অতএব, আমি সুপারিশ করছি:

  • যদি আপনার অ্যাপ্লিকেশনটি প্রচুর আইটেমগুলিতে পুনরাবৃত্তি করে বা আপনার লুপ কোডটি প্রায়শই ব্যবহৃত কোনও ফাংশনের অভ্যন্তরে থাকে তবে লুপের জন্য একটি সোজাসাপ্টা উত্তরটি:

    for (var i = 0; i < arr.length; i++) {
      // Do stuff with arr[i] or i
    }
  • যদি আপনার অ্যাপ্লিকেশনটি প্রচুর আইটেমের মাধ্যমে সত্যিকারভাবে পুনরাবৃত্তি না করে বা আপনার এখানে ছোট ছোট পুনরাবৃত্তিগুলি প্রয়োজন হয় তবে আপনার জেএস লাইব্রেরি থেকে প্রতিটি কলব্যাক বা অনুরূপ কোনও ক্রিয়াকলাপ আরও বোধগম্য হতে পারে এবং ত্রুটিগুলির প্রবণতা কম হতে পারে সূচী ভেরিয়েবল স্কোপ বন্ধ হয়ে গেছে এবং অ্যারে মানটি সরাসরি অ্যাক্সেস করে আপনার বন্ধনী ব্যবহার করার দরকার নেই:

    arr.forEach(function(value, index) {
      // Do stuff with value or index
    });
  • কয়েক বিলিয়ন সারি পুনরাবৃত্তি করার সময় এবং যদি আপনার অ্যারের দৈর্ঘ্য প্রক্রিয়াটির মধ্যে পরিবর্তন না ঘটে তবে আপনাকে যদি কয়েক মিলিসেকেন্ডে সত্যিই স্ক্র্যাচ করতে হয় তবে আপনি লুপের জন্য দৈর্ঘ্যটি ক্যাশে করার বিষয়টি বিবেচনা করতে পারেন। যদিও আমি মনে করি এটি আজকাল সত্যই প্রয়োজন হয় না:

    for (var i = 0, len = arr.length; i < len; i++) {
      // Do stuff with arr[i]
    }

নাঃ। jsbench.github.io/#67b13d4e78cdd0d7a7346410d5becf12 দেখায় যে দ্রুততমটি "বিপরীত লুপ, অন্তর্নিহিত তুলনা, ইনলাইনড কোড" (105,221 ops / সেকেন্ড) হয় যখন "লুপ, ক্যাশেড মান, ইনলাইনড কোড" কেবল 76,635 অপস / সেকেন্ড (ক্রোম 38.0.212.1) )
Fr0sT

@ ফ্র0 এসটি আপনার বেঞ্চমার্কটি এক ভিন্ন দৃশ্যাবলী, সূচি 1 থেকে <= দৈর্ঘ্যের অ্যারেগুলি অনুসরণ করে। অবশ্যই এটি বিভিন্ন ফলাফল হতে যাচ্ছে। যদি আপনি <দৈর্ঘ্যের সাথে শূন্য-ভিত্তিক অ্যারেগুলি ট্র্যাভার করার চেষ্টা করেন - যা আমার কাছে এটি স্বাভাবিক পরিস্থিতি বলে মনে হয় - আপনি আবিষ্কার করতে পারবেন যে ফলাফলগুলি একটি "সাধারণ" লুপের সাথে (ক্যাশেড দৈর্ঘ্য কিছুটা দ্রুত হওয়ার সাথে) আরও ভালভাবে অনুকূলিত হয়।
সিজিডো

কিওপ্যাক্সা বেঞ্চমার্কগুলিকে (0 <= i <দৈর্ঘ্য) এ পরিবর্তন করেছে, ফলাফলগুলি একই। "বিপরীত লুপ, অন্তর্নিহিত তুলনা, ফাংশন কল" 365 কেপস / সেকেন্ডে স্কোর করেছে, যখন "লুপ, ক্যাশেড মান, ইনলাইনড কোড" স্কোর করেছে 350 কপস / সেকেন্ড (এফএফ 51)
ফ্রিএসটি

@ ফ্র0 এসটি আপনি যদি সমান তুলনা ছাড়াই শূন্য-ভিত্তিক ক্যাশেড লুপগুলি পরিবর্তন করেন, যেমন for(let i=0, j=array.length; i < j; i++), লুপগুলির জন্য ফরোয়ার্ড যথেষ্ট গতি বাড়ায় । কয়েকটি পরীক্ষায় আমি এটি জিতে দৌড়েছি, বেশিরভাগ ক্ষেত্রে এটি ত্রুটির মার্জিন বা বিপরীত লুপের মধ্যে ছিল।
ইসহাক বি

1
@ আইসাকবি এবং সমস্ত, দুঃখিত আমি বেঞ্চটি বেশ ভুল বলে লক্ষ্য করি নি - সমস্ত প্রত্যক্ষ লুপগুলি পুনরাবৃত্তি হয় 1. দৈর্ঘ্য যখন বিপরীত লুপগুলি পুনরাবৃত্ত হয় দৈর্ঘ্য..০ (আরআর [দৈর্ঘ্য] আইটেমটি অবৈধ)। আমি পরীক্ষাগুলি ঠিক করেছি এবং এখন তারা নিম্নলিখিত ফলাফলগুলি দেখায়: "লুপ, ইনলাইনড কোড" 360,616 অপস / সেকেন্ড ± 0.27%, "লুপ, ক্যাশেড মান, ইনলাইনড কোড" 345,786 অপস / সেকেন্ড 18 2.18% (সিস!) "বিপরীত লুপ, অন্তর্নিহিত তুলনা, ইনলাইনড কোড "322,640 অপস / সেকেন্ড ± 2.90% (!!!)। এফএফ 5 1 দিয়ে টেস্টগুলি কার্যকর করা হয়েছিল। নতুন বেঞ্চটি এখানে jsbench.github.io/#6bdfcd2692ba80c16a68c88554281570 । সুতরাং এটি লুপগুলি uglifia করার কোনও বোধগম্য বলে মনে হচ্ছে।
Fr0sT

31

যদি অর্ডারটি গুরুত্বপূর্ণ না হয় তবে আমি এই স্টাইলটি পছন্দ করি:

for(var i = array.length; i--; )

এটি দৈর্ঘ্যকে ক্যাশে করে এবং লিখতে অনেক কম হয়। তবে এটি বিপরীত ক্রমে অ্যারের উপরে পুনরাবৃত্তি হবে।


6
আপনি সবেমাত্র এটি হত্যা করেছেন।
বিগনেশ রাজা

আপনার কি দরকার নেই আমি> = 0 ;?
মারওয়াআহমাদ

3
@ মারওয়াআহমাদ: নং i--একটি সংখ্যা ফেরত দেয় এবং একবার সংখ্যাটি 0শর্ত falseহওয়ার কারণে Boolean(0) === false
ফেলিক্স ক্লিং

29

এটি কেবল 2018 তাই একটি আপডেট সুন্দর হতে পারে ...

এবং সত্যই আমাকে গৃহীত উত্তরের সাথে একমত হতে হবে । এটি বিভিন্ন ব্রাউজারে স্থগিত হয়। কিছু forEachদ্রুত করে, কিছু করে for-loopএবং কিছু while এখানে সমস্ত পদ্ধতির একটি মানদণ্ড http://jsben.ch/mW36e

arr.forEach( a => {
  // ...
}

এবং যেহেতু আপনি লুপের মতো প্রচুর দেখতে পাচ্ছেন for(a = 0; ... )তা উল্লেখ করার মতো যে 'ভার' ছাড়া ভেরিয়েবলগুলি বিশ্বব্যাপী সংজ্ঞায়িত হবে এবং এটি নাটকীয়ভাবে গতিতে প্রভাব ফেলতে পারে সুতরাং এটি ধীর হয়ে যাবে।

ডাফের ডিভাইস অপেরাতে দ্রুত চালিত হয় তবে ফায়ারফক্সে নয়

var arr = arr = new Array(11111111).fill(255);
var benches =     
[ [ "empty", () => {
  for(var a = 0, l = arr.length; a < l; a++);
}]
, ["for-loop", () => {
  for(var a = 0, l = arr.length; a < l; ++a)
    var b = arr[a] + 1;
}]
, ["for-loop++", () => {
  for(var a = 0, l = arr.length; a < l; a++)
    var b = arr[a] + 1;
}]
, ["for-loop - arr.length", () => {
  for(var a = 0; a < arr.length; ++a )
    var b = arr[a] + 1;
}]
, ["reverse for-loop", () => {
  for(var a = arr.length - 1; a >= 0; --a )
    var b = arr[a] + 1;
}]
,["while-loop", () => {
  var a = 0, l = arr.length;
  while( a < l ) {
    var b = arr[a] + 1;
    ++a;
  }
}]
, ["reverse-do-while-loop", () => {
  var a = arr.length - 1; // CAREFUL
  do {
    var b = arr[a] + 1;
  } while(a--);   
}]
, ["forEach", () => {
  arr.forEach( a => {
    var b = a + 1;
  });
}]
, ["for const..in (only 3.3%)", () => {
  var ar = arr.slice(0,arr.length/33);
  for( const a in ar ) {
    var b = a + 1;
  }
}]
, ["for let..in (only 3.3%)", () => {
  var ar = arr.slice(0,arr.length/33);
  for( let a in ar ) {
    var b = a + 1;
  }
}]
, ["for var..in (only 3.3%)", () => {
  var ar = arr.slice(0,arr.length/33);
  for( var a in ar ) {
    var b = a + 1;
  }
}]
, ["Duff's device", () => {
  var len = arr.length;
  var i, n = len % 8 - 1;

  if (n > 0) {
    do {
      var b = arr[len-n] + 1;
    } while (--n); // n must be greater than 0 here
  }
  n = (len * 0.125) ^ 0;
  if (n > 0) { 
    do {
      i = --n <<3;
      var b = arr[i] + 1;
      var c = arr[i+1] + 1;
      var d = arr[i+2] + 1;
      var e = arr[i+3] + 1;
      var f = arr[i+4] + 1;
      var g = arr[i+5] + 1;
      var h = arr[i+6] + 1;
      var k = arr[i+7] + 1;
    }
    while (n); // n must be greater than 0 here also
  }
}]];
function bench(title, f) {
  var t0 = performance.now();
  var res = f();
  return performance.now() - t0; // console.log(`${title} took ${t1-t0} msec`);
}
var globalVarTime = bench( "for-loop without 'var'", () => {
  // Here if you forget to put 'var' so variables'll be global
  for(a = 0, l = arr.length; a < l; ++a)
     var b = arr[a] + 1;
});
var times = benches.map( function(a) {
                      arr = new Array(11111111).fill(255);
                      return [a[0], bench(...a)]
                     }).sort( (a,b) => a[1]-b[1] );
var max = times[times.length-1][1];
times = times.map( a => {a[2] = (a[1]/max)*100; return a; } );
var template = (title, time, n) =>
  `<div>` +
    `<span>${title} &nbsp;</span>` +
    `<span style="width:${3+n/2}%">&nbsp;${Number(time.toFixed(3))}msec</span>` +
  `</div>`;

var strRes = times.map( t => template(...t) ).join("\n") + 
            `<br><br>for-loop without 'var' ${globalVarTime} msec.`;
var $container = document.getElementById("container");
$container.innerHTML = strRes;
body { color:#fff; background:#333; font-family:helvetica; }
body > div > div {  clear:both   }
body > div > div > span {
  float:left;
  width:43%;
  margin:3px 0;
  text-align:right;
}
body > div > div > span:nth-child(2) {
  text-align:left;
  background:darkorange;
  animation:showup .37s .111s;
  -webkit-animation:showup .37s .111s;
}
@keyframes showup { from { width:0; } }
@-webkit-keyframes showup { from { width:0; } }
<div id="container"> </div>


3
@ মায়াকন আপনি সম্ভবত বলতে চেয়েছিলেন "এবং এটি সর্বত্র কাজ করে তবে অপেরা মিনি"
ডুব

3
@ মায়াকন যা ডিফল্ট দৃশ্যে তালিকাভুক্ত নয় কারণ সকল ব্যবহারকারীর 0.18% আইই 8 রয়েছে এবং এটি সমর্থন করার চেষ্টা করে আপনার সময় নষ্ট করা উচিত নয়; 2018 এ এটি একটি মৃত ঘোড়া।
ডাব

1
আপনি যদি বিশ্বের সমস্ত ব্যবহারকারীকে বিবেচনা করেন তবে এটি অবশ্যই সত্য। তবে, দুর্ভাগ্যক্রমে, বিশ্বের নির্দিষ্ট অংশগুলিতে আই 8 এখনও প্রাসঙ্গিক।
মায়কন

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

1
থাহলিল ধন্যবাদ
নালকুব

19

2014 Whileফিরে এসেছে

কেবল যৌক্তিক মনে করুন।

এটা দেখ

for( var index = 0 , length = array.length ; index < length ; index++ ) {

 //do stuff

}
  1. কমপক্ষে 2 টি ভেরিয়েবল তৈরি করতে হবে (সূচী, দৈর্ঘ্য)
  2. সূচী দৈর্ঘ্যের চেয়ে ছোট কিনা তা পরীক্ষা করা দরকার
  3. সূচক বাড়াতে হবে
  4. forলুপ 3 প্যারামিটার আছে

এখন বলুন কেন এটির চেয়ে দ্রুত হওয়া উচিত:

var length = array.length;

while( --length ) { //or length--

 //do stuff

}
  1. একটি পরিবর্তনশীল
  2. কোনও চেক নেই
  3. সূচক হ্রাস পেয়েছে (মেশিনগুলি এটি পছন্দ করে)
  4. while একটি মাত্র প্যারামিটার রয়েছে

ক্রোম 28 যখন দেখিয়েছিল যে লুপের জন্য সময়ের চেয়ে দ্রুত হয় তখন আমি সম্পূর্ণ বিভ্রান্ত হয়ে পড়েছিলাম। এটি অবশ্যই কিছুটা বেন হয়েছে

"আহা, সবাই লুপের জন্য ব্যবহার করছে, ক্রোমের জন্য বিকাশ করার সময় সেটিতে ফোকাস করা উচিত।"

তবে এখন, ২০১৪ সালে যখন লুপটি আবার ক্রোমে ফিরে এসেছে। এটি 2 গুণ দ্রুত, অন্যান্য / পুরানো ব্রাউজারগুলিতে এটি সর্বদা দ্রুত ছিল।

ইদানীং আমি কিছু নতুন পরীক্ষা করেছি। এখন সত্যিকারের দাবীতে এই সংক্ষিপ্ত কোডগুলি মূল্যহীন এবং jsperf আসলে লুপ লুপটি যথাযথভাবে সম্পাদন করতে পারে না কারণ এটির অ্যারেওলাইট পুনরায় তৈরি করা দরকার যা সময় নেয়।

আপনি জেএসপিফির উপর কিছুক্ষণ লুপের আসল গতি পেতে পারবেন না।

আপনাকে আপনার নিজস্ব কাস্টম ফাংশন তৈরি করতে হবে এবং এটি দিয়ে চেক করতে হবে window.performance.now()

এবং হ্যাঁ ... লুপটি কেবল দ্রুততর হওয়ার কোনও উপায় নেই।

আসল সমস্যাটি হ'ল ডম ম্যানিপুলেশন / রেন্ডারিং সময় / অঙ্কনের সময় বা তবে আপনি এটিকে কল করতে চান।

উদাহরণস্বরূপ আমার কাছে একটি ক্যানভাস দৃশ্য রয়েছে যেখানে আমাকে স্থানাঙ্ক এবং সংঘর্ষ গণনা করতে হবে ... এটি 10-200 মাইক্রো সেকেন্ডের (মিলিসেকেন্ড নয়) এর মধ্যে করা হয়। এটি সমস্ত কিছু রেন্ডার করতে আসলে বিভিন্ন মিলিসেকেন্ড লাগে Dডম হিসাবে একই।

কিন্তু

কিছু ক্ষেত্রে এর জন্য আরও একটি দুর্দান্ত পারফরম্যান্ট উপায় ব্যবহার করা হচ্ছে loop... উদাহরণস্বরূপ একটি অ্যারের অনুলিপি / ক্লোন করা

for(
 var i = array.length ;
 i > 0 ;
 arrayCopy[ --i ] = array[ i ] // doing stuff
);

পরামিতিগুলির সেটআপটি লক্ষ্য করুন:

  1. লুপের মতোই আমি কেবল একটি ভেরিয়েবল ব্যবহার করছি
  2. সূচক 0 এর চেয়ে বড় কিনা তা পরীক্ষা করা দরকার;
  3. যেহেতু আপনি দেখতে পাচ্ছেন যে প্রতিটি লুপের জন্য ব্যবহার করা লুপগুলির জন্য এই পদ্ধতির তুলনায় স্বাভাবিক, আমি 3 তম প্যারামিটারের ভিতরে স্টাফ করি এবং আমি সরাসরি অ্যারের অভ্যন্তরেও হ্রাস পাই।

বলেছিল, এটি নিশ্চিত করে যে মেশিনগুলি -

আমি লিখছি যে আমি এটিকে আরও ছোট করার এবং কিছু অকেজো জিনিসগুলি অপসারণ করার জন্য ভাবছিলাম এবং একই স্টাইলটি ব্যবহার করে এটি লিখেছিলাম:

for(
 var i = array.length ;
 i-- ;
 arrayCopy[ i ] = array[ i ] // doing stuff
);

এমনকি যদি এটি ছোট হয় তবে মনে হয় যে iআরও একটি সময় ব্যবহার করা সমস্ত কিছু ধীর করে দেয়। এটি পূর্বের forলুপের চেয়ে 1/5 ধীর while

দ্রষ্টব্য:; ছাড়া looo পরে খুবই গুরুত্বপূর্ণ{}

এমনকি যদি আমি আপনাকে কেবল বলেছি যে স্ক্রিপ্টগুলি পরীক্ষা করার জন্য জাস্পফারফ সবচেয়ে ভাল উপায় নয় .. আমি এখানে এই 2 টি লুপ যুক্ত করেছি

http://jsperf.com/caching-array-length/40

এবং এখানে জাভাস্ক্রিপ্টে পারফরম্যান্স সম্পর্কে অন্য উত্তর

https://stackoverflow.com/a/21353032/2450730

এই উত্তরটি জাভাস্ক্রিপ্ট লেখার পারফরম্যান্স পদ্ধতিগুলি দেখানো। সুতরাং আপনি যদি এটি পড়তে না পারেন, জিজ্ঞাসা করুন এবং আপনি উত্তর পেয়ে যাবেন বা জাভাস্ক্রিপ্ট সম্পর্কে একটি বই পড়বেন http://www.ecma-international.org/ecma-262/5.1/


এই উত্তর খুব ভাল শুরু হয় । আমি লক্ষ করেছি যে বছরের শেষ দু'টি forতখনকার চেয়ে দ্রুততর ছিল whileএবং আমি একবার ক্রোম-ডেভের উপর পড়েছিলাম কারণ এটির কারণ আপনি উল্লেখ করেছেন of আগে whileধরা পড়ার আগে কেবল সময়ের ব্যাপার হবে। সেদিক থেকে আপনার উত্তরের প্রথম অংশের যুক্তিটি ধরে রাখবে (আবারও হ্যাঁ)! তবে আধুনিক প্রয়োগগুলি এখন কঠোরভাবে প্রতিটি ইমা-নির্দিষ্ট ধাপ অনুসরণ করে না (তারা অনুকূলিত করে)। যেহেতু এখন আপনার ইঞ্জিনটি সর্বাধিক লক্ষণীয় বোতল-ঘাড় নয়, এখন আসলে কেউ উল্টো লুপগুলিতে সিপিইউ ক্যাশে-মিস করতে পারে !
গীতারল্যাব

ব্যাখ্যা করুন, তাই সম্ভবত আমি উত্তরটি সংশোধন করতে পারি বা নতুন কিছু শিখতে পারি। বিটিডব্লিউ উত্তরটি এখন এক বছরেরও বেশি পুরানো ... ব্রাউজারগুলি বরাবরই সময়ের সাথে সাথে পরিবর্তিত হতে পারে ...
cocco

আমার মতে, যদিও (- দৈর্ঘ্য) মন্দ কারণ কারণ এটি প্রযুক্তিগতভাবে কাজ করে কারণ 0 মিথ্যা, 0 এবং মিথ্যা সত্যই শব্দার্থতভাবে একই জিনিস হয় না।
scott.korin

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

9
"মেশিনগুলি এটিকে পছন্দ করে" লন্ড্রি ডিটারজেন্টের জন্য কোনও বিজ্ঞাপনের বাক্যটির মতো শোনায়
কোকোবিয়ান

11

http://jsperf.com/caching-array-length/60

পরীক্ষার সর্বশেষ সংশোধন, যা আমি প্রস্তুত করেছি (পুরানোটিকে পুনরায় ব্যবহার করে) একটি জিনিস দেখায়।

ক্যাচিংয়ের দৈর্ঘ্য এত গুরুত্বপূর্ণ নয়, তবে এটি ক্ষতি করে না।

উপরে সংযুক্ত পরীক্ষার প্রতিটি প্রথম রান (নতুনভাবে খোলা ট্যাবটিতে) আমার ডেবিয়ান স্কুইজ -৪-বিটে ক্রোম, অপেরা এবং ফায়ারফক্সে সর্বশেষ 4 টি স্নিপেটের (চার্টে তৃতীয়, 5 তম, 7 ম এবং 10 তম) সেরা ফলাফল দেয় ( আমার ডেস্কটপ হার্ডওয়্যার )। পরবর্তী রানগুলি বেশ আলাদা ফলাফল দেয়।

পারফরম্যান্স-ভিত্তিক সিদ্ধান্তগুলি সহজ:

  • লুপের জন্য যান (এগিয়ে) এবং !==পরিবর্তে ব্যবহার করে পরীক্ষা করুন <
  • যদি আপনাকে পরে অ্যারেটি পুনরায় ব্যবহার করতে না হয় তবে হ্রাসযুক্ত দৈর্ঘ্য এবং ধ্বংসাত্মক- shift()বিন্যাসের লুপটি কার্যকর।

TL; ড

আজকাল (২০১১.১০) নিচের প্যাটার্নটিকে দ্রুততম বলে মনে হচ্ছে।

for (var i = 0, len = arr.length; i !== len; i++) {
    ...
}

মনে রাখবেন arr.lengthএখানে ক্যাচিং গুরুত্বপূর্ণ নয়, সুতরাং আপনি কেবল পরীক্ষা করতে পারেন i !== arr.lengthএবং কার্য সম্পাদন কমবে না তবে আপনি সংক্ষিপ্ত কোড পাবেন।


পিএস: আমি জানি যে shift()এর ফলাফল সহ স্নিপেটে 0 তম উপাদানটি অ্যাক্সেস করার পরিবর্তে ব্যবহার করা যেতে পারে তবে আমি পূর্ববর্তী পুনর্বিবেচনা (যা লুপগুলির ক্ষেত্রে ভুল ছিল) পুনরায় ব্যবহার করার পরে এবং পরে আমি ইতিমধ্যে প্রাপ্ত ফলাফলগুলি হারাতে চাইনি তা উপেক্ষা করেছি।


পরিবর্তনশীল অন্তর্নিহিত লুপটি তৈরি করা যাক যেমন চলতি = আরআর [i] একটি কর্মক্ষমতা হ্রাস করতে পারে (বড় মেমরি বরাদ্দ)? নাকি লুপের আগে কারেন্ট ঘোষণা করা ভাল? অথবা লুপের ভিতরে সমস্ত জায়গায় আরআর [i] ব্যবহার করবেন?
ম্যাকারভ সের্গেই

8

খাঁটি অভিনয় হিসাবে "সেরা"? বা কর্মক্ষমতা এবং পাঠযোগ্যতা?

খাঁটি পারফরম্যান্স "সেরা" এটি হ'ল এটি ক্যাশে এবং ++ প্রিফিক্স অপারেটর ব্যবহার করে (আমার ডেটা: http://jsperf.com/caching-array-length/189 )

for (var i = 0, len = myArray.length; i < len; ++i) {
  // blah blah
}

আমি যুক্তি দিয়ে বলব যে ক্যাশে-কম-ফর-লুপ এক্সিকিউশন সময় এবং প্রোগ্রামার পড়ার সময় সেরা ব্যালান্স। সি / সি ++ / জাভা দিয়ে শুরু হওয়া প্রতিটি প্রোগ্রামার এই পড়ার জন্য কোনও এমএস নষ্ট করবে না

for(var i=0; i < arr.length; i++){
  // blah blah
}

2
পাঠযোগ্যতার জন্য +1। যত ভাল lenনাম দেওয়া হোক না কেন , প্রথম বারের জন্য একটি ডাবল নিতে হবে do দ্বিতীয় লুপের উদ্দেশ্যটি সুস্পষ্ট।
জোশ জনসন

7

** লুপের ভিতরে অ্যারের দৈর্ঘ্যটি ক্যাশে করুন, কয়েক সেকেন্ড সময় বাদ দেওয়া হবে। অ্যারেতে আইটেমগুলির উপর নির্ভর করে যদি অ্যারেতে আরও আইটেম থাকে তবে সময়কার মিসির সাথে সম্মানের সাথে বড় পার্থক্য রয়েছে *

**

sArr; //Array[158];

for(var i = 0 ; i <sArr.length ; i++) {
 callArray(sArr[i]); //function call
}

***end: 6.875ms***

**

**

sArr; //Array[158];
for(var i = 0,len = sArr.length ; i < len ; i++) {
  callArray(sArr[i]); //function call
}

***end: 1.354ms***

**


6

এটি এখন পর্যন্ত সবচেয়ে দ্রুততম পথ বলে মনে হচ্ছে ...

var el;
while (el = arr.shift()) {
  el *= 2;
}

বিবেচনা করুন যে এটি অ্যারে গ্রাস করবে, এটি খাবে এবং কিছুই রেখে যাবে না ...


2
arr.shift();পরিবর্তে arr.pop() যাতে অ্যারে বিপরীত এড়ানো যেতে পারে।
টিন্টু সি রাজু

1
@ গারগারোজ যদি আপনি কোনও ওয়েবসার্ভিস থেকে কোনও জেএসওএন পাচ্ছেন উদাহরণস্বরূপ একটি চ্যাট পরিষেবা বা কোনও পণ্য ক্যাটালগের আইটেম। আর একবার যখন আপনাকে একবার অ্যারে ব্যবহার করা দরকার তখন উদাহরণস্বরূপ একটি চার্ট হতে পারে যা ইন্টারভাল ভিত্তিতে অনেকগুলি স্থানাঙ্ক পায়। এর অনেক উদাহরণ রয়েছে।
সেরজিও

দুর্দান্ত, আপনাকে অনেক ধরণের ব্যাখ্যা দেওয়ার জন্য ধন্যবাদ; আপনি কি আমাকে সেই দিকে নির্দেশ করতে পারেন যেখানে আমি এই ধরণের লুপটি ব্যবহার করতে আরও উদাহরণ পেতে পারি?
গার্গারোজ

1
বর্তমানে ক্রোম 53 এবং ফায়ারফক্স 48 এ এটি সবচেয়ে ধীর পদ্ধতির মধ্যে একটি - পারফ্রস.ইন.ফো
অ্যারি-

1
@ আলিরিজা একমত, আমার উত্তরেও এর জন্য আমার একটি মন্তব্য আছে।
সার্জিও

4

এটি ২০১ 2017 সালের কথা

আমি কিছু পরীক্ষা করেছি।

https://jsperf.com/fastest-way-to-iterate-through-an-array/

দেখে মনে হচ্ছে whileপদ্ধতিটি ক্রোমের পক্ষে দ্রুততম।

বাম হ্রাস মত দেখায় ( --i) অনেক দ্রুত অন্যদের (চেয়ে ++i, i--, i++) ফায়ারফক্স উপর।

এই পদ্ধতির গড় রোজা হয়। কিন্তু এটি বিপরীত ক্রমে অ্যারের পুনরাবৃত্তি করে।

let i = array.length;
while (--i >= 0) {
    doSomething(array[i]);
}

যদি ফরওয়ার্ড অর্ডারটি গুরুত্বপূর্ণ হয় তবে এই পদ্ধতির ব্যবহার করুন।

let ii = array.length;
let i = 0;
while (i < ii) {
    doSomething(array[i]);
    ++i;
}

3
কীওয়ার্ডটি ব্যবহার করে letআপনি লুপ পারফরম্যান্সের পরিবর্তে স্কোপ তৈরির পারফরম্যান্সের তুলনা করছেন। let i = 0, ii = array.lengthআপনার forলুপগুলিতে ব্যবহার করা forব্লকের অভ্যন্তরে সেই ভেরিয়েবলগুলির জন্য একটি নতুন সুযোগ তৈরি করবে । আপনার whileউদাহরণগুলি whileব্লকের ভিতরে ভেরিয়েবলগুলির জন্য একটি নতুন সুযোগ তৈরি করে না এবং এ কারণেই সেগুলি দ্রুত। যদি আপনি নিজের লুপগুলির varপরিবর্তে ব্যবহার করেন তবে আপনি letদেখতে পাবেন যে লুপগুলি কীভাবে এখনও 2017 এর মতো তত দ্রুত, তবে আরও পঠনযোগ্য।
সিজিডো

এখানে আমি যে বিষয়ে কথা বলছি তার একটি জাস্টস্পিফ এখানে দেওয়া হয়েছে: jsperf.com/javascript-loop-testing-let-vs-var
সিজিডো

এটি ক্রোমে কেবল একটি সমস্যা। অন্যান্য ব্রাউজারে varএবং let- একই কর্মক্ষমতা আছে stackoverflow.com/a/32345435/1785975
SeregPie

মজাদার. যাইহোক, আমি " whileক্রোমে দ্রুত হওয়া " এর বিবৃতিটি সঠিক খুঁজে পাই না । এটি কেবলমাত্র যদি letক্রোমে সেই কীওয়ার্ডটির পারফরম্যান্স সমস্যার কারণে ব্যবহার হয়। যদি varঅন্য ব্রাউজারগুলি ব্যবহার করে বা তার সাথে হয় forএবং whileবেশ একইরকম হয় তবে কখনও কখনও forবেঞ্চমার্কের উপর নির্ভর করে আরও দ্রুত হয় এবং এটি আরও কমপ্যাক্ট এবং পঠনযোগ্য ইমো।
সিজিডো

2

আমি সবসময় প্রথম স্টাইলে লিখি।

এমনকি যদি কোনও সংকলক অ্যারেগুলির জন্য এটি অপ্টিমাইজ করার জন্য যথেষ্ট স্মার্ট হয় তবে তবুও এটি স্মার্ট হয় যদি আমরা এখানে DOMNodeList ব্যবহার করছি বা গণনার দৈর্ঘ্য সহ কিছু জটিল অবজেক্ট?

অ্যারে সম্পর্কে প্রশ্নটি কী তা আমি জানি তবে আমি মনে করি আপনার সমস্ত লুপগুলি এক স্টাইলে লেখাই ভাল অনুশীলন।


1
var arr = []; // The array
var i = 0;
while (i < arr.length) {
    // Do something with arr[i]
    i++;
}

i ++ ++ i, --i এবং i-- এর চেয়ে দ্রুত

এছাড়াও, আপনি শেষ বারটি আইআর [i++] করে শেষ বারে সংরক্ষণ করতে পারেন তবে আপনাকে অ্যাক্সেস করতে হবে (তবে এটি ডিবাগ করা কঠিন হতে পারে)।

আপনি এটি এখানে পরীক্ষা করতে পারেন (অন্যান্য লুপ পরীক্ষা সহ): http://jsperf.com/for-vs- momentpop/5


1
বর্তমানে ক্রোম 53-এ এটি সত্য, তবে ফায়ারফক্স 48 এর একই গতি রয়েছে - perfjs.info/array-iteration দেখুন
পেনক্রফ


0

আমি একটি বিশাল অ্যারের পুনরাবৃত্তি করার জন্য আরও কিছু উপায় চেষ্টা করেছি এবং জানতে পেরেছি যে অ্যারের দৈর্ঘ্য অর্ধেক করা এবং তারপরে একটি লুপে উভয় অংশকে পুনরুক্ত করা আরও দ্রুত। বিশাল অ্যারে প্রক্রিয়াকরণের সময় এই পারফরম্যান্স পার্থক্যটি দেখা যায় ।

var firstHalfLen =0;
var secondHalfLen = 0;
var count2=0;
var searchterm = "face";
var halfLen = arrayLength/2;
if(arrayLength%2==halfLen)
{
   firstHalfLen = Math.ceil(halfLen);
   secondHalfLen=Math.floor(halfLen);
}
else
{
   firstHalfLen=halfLen;
   secondHalfLen=halfLen;
}
for(var firstHalfCOunter=0,secondHalfCounter = arrayLength-secondHalfLen;
    firstHalfCOunter < firstHalfLen;
    firstHalfCOunter++)
{
  if(mainArray[firstHalfCOunter].search(new RegExp(searchterm, "i"))> -1)
  {
    count2+=1;
  }
  if(secondHalfCounter < arrayLength)
  {
    if(mainArray[secondHalfCounter].search(new RegExp(searchterm, "i"))> -1)
    {
        count2+=1;
    }
    secondHalfCounter++; 
  }
}

উপরোক্ত পদ্ধতির জন্য লুপ লুপের জন্য ক্যাশেড দৈর্ঘ্যের মধ্যে কিছু পারফরম্যান্স তুলনা (টাইমআরজেএস ব্যবহার করে)।

http://jsfiddle.net/tejzpr/bbLgzxgo/


0

আর একটি জেএসপিফার ডটকম পরীক্ষা: http://jsperf.com/ moment-revers-vs-for-cached-length

বিপরীতে লুপটি দ্রুততম বলে মনে হচ্ছে। কেবল সমস্যাটি হ'ল যখন (--i) 0 এ থামবে তখন আমি কীভাবে আমার লুপের অ্যারে [0] এ অ্যাক্সেস করতে পারি?


2
আপনি যদি তা করেন while (i--)তবে সত্যতার সত্যতা iহ্রাসের পরিবর্তে হ্রাস হওয়ার আগে এবং তারপরে সত্যতা পরীক্ষা করার আগে পরীক্ষা করা হবে।
জাস্টিন ফিশার

0

সেপ্টেম্বর 2017 পর্যন্ত এই jsperf পরীক্ষাগুলি ক্রোম 60 এ সর্বাধিক পারফরম্যান্ট হতে নিম্নলিখিত প্যাটার্নটি দেখাচ্ছে:

function foo(x) {
 x;
};
arr.forEach(foo);

কেউ কি পুনরুত্পাদন করতে সক্ষম?


হ্যাঁ এটি দ্রুততম বলে মনে হচ্ছে, তবে এটি IE11 এ চালানোর চেষ্টা করুন এবং এই বিকল্পগুলি সবচেয়ে গতিযুক্ত। এবং ফায়ারফক্স 55.03 এ 'পুরানো ব্যস্টেড ক্যাশেড লেন' ক্রোমের 3.3k এর তুলনায় স্তম্ভিত পারফরম্যান্স 12 মিলিতে পৌঁছেছে। সমস্ত ব্রাউজারে পারফরম্যান্সে ধারাবাহিক হওয়ার জন্য আপনাকে প্রতিটি ব্রাউজারের জন্য দ্রুততম গড় লুপ ব্যবহার করা উচিত।
প্লিপ্পি


0

লুপটি লুপের চেয়ে কিছুটা দ্রুত।

var len = arr.length;
while (len--) {
    // blah blah
}

পরিবর্তে লুপ ব্যবহার করুন



-1

আমি জানি সবচেয়ে মার্জিত সমাধান হ'ল মানচিত্র ব্যবহার করা।

var arr = [1,2,3];
arr.map(function(input){console.log(input);});

46
প্রশ্নটি লুপের মাধ্যমে পুনরাবৃত্তি করার সবচেয়ে ধীরতম
উপায়ের


-1

অ্যারেতে লুপ করার দ্রুততর উপায় হ'ল ফিল্টারটি ব্যবহার করে। ফিল্টার () পদ্ধতিটি এমন সমস্ত উপাদান দিয়ে একটি নতুন অ্যারে তৈরি করে যা প্রদত্ত ফাংশন দ্বারা প্রয়োগ করা পরীক্ষায় পাস করে।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

const words = ['Floccinaucinihilipilification', 'limit', 'elite', 'Hippopotomonstrosesquipedaliophobia', 'destruction', 'present'];

const result = words.filter(word => word.length > 6);

console.log(new Date(), result);

আমার অভিজ্ঞতা থেকে, আমি সর্বদা ফিল্টার, মানচিত্র ইত্যাদি পছন্দ করি ..


প্রশ্নটি অ্যারেটির পুনরুক্তি সম্পর্কে খুব কম সময়ের মধ্যে অ্যারেটিকে কোনও নতুন অ্যারেতে অনুলিপি না করে।
রাহুল কদুকার

-1

২০১২ সাল পর্যন্ত ওয়েব ওয়ার্কার আরও বেশি জনপ্রিয় হয়েছে, বড় ডেটাসেটের জন্য, আমরা মাল্টি-কোর প্রসেসরের পুরোপুরি ব্যবহার করে অনেক দ্রুত প্রক্রিয়া করার জন্য ওয়েব ওয়ার্কার ব্যবহার করতে পারি।

আমাদের কাছে সমান্তরাল.জেও রয়েছে যা ওয়েব ওয়ার্কারকে ডেটা প্রক্রিয়াকরণের জন্য ব্যবহার করা আরও সহজ করে তোলে।

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