Использование Javascript для удаления увеличивает использование оперативной памяти и время выполнения

#javascript #node.js #arrays #memory #benchmarking

#javascript #node.js #массивы #память #сравнительный анализ

Вопрос:

Я реализовал тест с использованием js-meter и сравнил методы массива map и forEach при анализе некоторых данных. Смотрите мой сценарий ниже.

Сценарий: Например. если мы получаем огромный массив из API и просто хотим создать экземпляр Date объекта на основе заданной метки времени для каждого элемента и хотим избавиться от некоторых ненужных свойств.

Две вещи для меня очень странные:

  1. Использование map() , как показано в скрипте, должно создать совершенно новый массив с новыми объектами. Таким образом, использование памяти должно быть двойным, но это не так.

  2. Использование delete внутри цикла ( map , forEach , for ) увеличивает использование памяти и время, затрачиваемое ~ в 3 раза. Почему использование delete здесь так плохо?

Дополнительная информация: я провел тесты отдельно (просто прокомментировал все, кроме одного) на MacBook Pro с macOS Catalina с версией узла 10.15.3

 const jm = require('js-meter');

const isPrint = true;
const isKb = true;       // or Mb
const m = new jm({isPrint, isKb});
const printItemIndex = 45;
const arr = [];
const now = Date.now();

//  Create an array with some fake example data.
for(let i = 0; i < 100000; i  ) {
    const delay = Math.floor(Math.random() * 10000);    
    arr.push({
        index: i,
        delay,
        timestamp: now
  });
}

//  Map the array and turn a timestamp to a Date
//  Result of Benchmark: 33 MB RAM, 58ms
console.log("nnTest 1 with .map()");
const result = arr.map(data => {
    return {
        delay: data.delay,
        date: new Date(data.timestamp   data.delay)
    };
});

//  Use forEach and save weak copy to result array
//  Result of Benchmark: 91 MB RAM, 127ms
console.log("nnTest 2 with .forEach()");
arr.forEach(data => {
  data.date = new Date(data.timestamp   data.delay)
  delete data.index;
  delete data.timestamp;
});
const result = arr;

//  Map the array and turn a timestamp to a Date
//  Result of Benchmark: 83 MB RAM, 140ms
console.log("nnTest 3 with .map() and a delete");
const result = arr.map(data => {
    delete data.index;
    return {
        delay: data.delay,
        date: new Date(data.timestamp   data.delay)
    };
});

//  Use forEach and save weak copy to result array
//  Result of Benchmark: 32 MB RAM, 45ms
console.log("nnTest 4 with .forEach() w/o delete");
arr.forEach(data => {
  data.date = new Date(data.timestamp   data.delay);
});
const result = arr;

//  Use forEach and save weak copy to result array
//  Result of Benchmark:  32 MB RAM, 46ms
console.log("nnTest 5 with for loop");
for(let i = 0; i < arr.length; i  ) {    
    arr[i].date = new Date(arr[i].timestamp   arr[i].delay);
}
const result = arr;

//  Use forEach and save weak copy to result array
//  Result of Benchmark: 92 MB RAM, 145ms
console.log("nnTest 6 with for loop");
for(let i = 0; i < arr.length; i  ) {    
    arr[i].date = new Date(arr[i].timestamp   arr[i].delay);
    delete arr[i].index;
    delete arr[i].timestamp;
}
const result = arr;

m.stop();