JavaScript встроенных модулей превосходит анонимные функции? - PullRequest
0 голосов
/ 14 июля 2020

Из-за # stay-and-code у меня было немного свободного времени, и я наткнулся на то, что меня заинтересовало.

Чтобы прояснить, этот вопрос никоим образом не предполагает использования любого из следующего в качестве микрооптимизации. Это просто некоторые наблюдения за тем, как они работают, и чтобы лучше понять ситуацию в контексте моего вопроса.

Кроме того, я намеренно манипулировал размерами выборки, чтобы лучше продемонстрировать некоторые аспекты моих примеров ...

Пример результатов.

ВНИМАНИЕ: тесты, полученные с помощью средств StackOverflow, сильно отличаются от тех, которые вы получили бы, просто запустив код в консоли в chrome. Я использую вывод консоли из chrome в качестве основы для сравнения. image

/**

    To see the benchmarks, open dev tools and watch the console. Then click "run with JS" in the JSBIN output 
    panel.

**/
// setups... not benchmarked.
var sampleSize = 2000;
var string = "";
var j = 0;
var listof1000s = loopForRange(sampleSize);
var listof1000s2 = loopAnonRangeCB(sampleSize / 2, function(i, r) {
  return r.push(i), r;
});

var results = [];


function noop(i, context) {
  j++;
  results.push(i + 1);
}

function loopForRange(range) {
  var results = [];
  for (let i = 0; i < range; i++)
    results[i] = i;
  return results;
}

function loopAnonRangeCB(times, cb, loop, i = 0, results = [], ) {
  return (loop = function() {
    if (i < times) {
      cb(i++, results);
      loop();
    }
    return results;
  })(times);
}

// start of benchmarks...

/*
    @user3647971 I see what you are looking for, I've made some adjustements.
     
*/


  // First
        console.time("Loop: loopForIndexed");
          loopForIndexed(listof1000s, function(i){ 
              j++;
          });
        console.timeEnd("Loop: loopForIndexed");
        results.loopForIndexed = j;

    // Next
        j = 0;
        console.time("Loop: loopAnonIndexed");
          loopAnonIndexed(listof1000s, function(i){ 
              j++;
          });
        console.timeEnd("Loop: loopAnonIndexed");
        results.loopAnonIndexed = j;

    // Next
        j = 0;
        console.time("Loop: useForEach");
          useForEach(listof1000s, function(e, i, c){ 
              j++;
          });
        console.timeEnd("Loop: useForEach");
        results.useForEachResults = j;


    // Last
        j = 0;
        console.time("Loop: loopForEach");
          loopForEach(listof1000s, function(i){ 
              j++;
          });
        console.timeEnd("Loop: loopForEach");
        results.loopForEachResults = j;
    


// Dump generated output.
console.log(results);


// End of benchmarks...

function loopForIndexed(collection, cb) {
  for (let i = 0; i < collection.length; i++) {
    cb(collection[i], i, collection);
  }
}

function loopAnonIndexed(collection, cb, loop, i = 0, results = [], ) {
  (loop = function() {
    i < collection.length ? (cb(collection[i], i++, collection), loop()) : null;
  })(listof1000s);
}

function useForEach(collection, callback) {
  [...collection].forEach(callback);
}

function loopForEach(collection, cb, i = 0, m = 0, loop) {
  (loop = (function() {
    0 < m ? loop(m, cb(m--)) : null;
  }))(m = collection.length)
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...