#javascript #node.js #arrays #memory #benchmarking
#javascript #node.js #массивы #память #сравнительный анализ
Вопрос:
Я реализовал тест с использованием js-meter и сравнил методы массива map
и forEach
при анализе некоторых данных. Смотрите мой сценарий ниже.
Сценарий: Например. если мы получаем огромный массив из API и просто хотим создать экземпляр Date
объекта на основе заданной метки времени для каждого элемента и хотим избавиться от некоторых ненужных свойств.
Две вещи для меня очень странные:
-
Использование
map()
, как показано в скрипте, должно создать совершенно новый массив с новыми объектами. Таким образом, использование памяти должно быть двойным, но это не так. -
Использование
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();