Удалить элемент массива без сплайсинга ()
Я занимаюсь разработкой игры на JavaScript и хочу максимально снизить потребление памяти. Поэтому я снова установил для некоторых объектов значение null, чтобы они могли собирать мусор. Я прочитал статью, которая рекомендует избегать таких функций, как Array.splice()
, потому что это создает новый массив, который выделяет новую память.
Итак, я реализовал JSFiddle с собственной функцией, которая удаляет элемент по определенному индексу и сдвигает все элементы позади, поэтому длина будет установлена на length -= 1
, Это влияет только на существующий массив вместо создания нового:
Функция для использования вместо сращивания:
deleteElem = function(arr, el) {
var index = arr.indexOf(el);
if (index > -1) {
var len = arr.length - 1;
for (var i = index; i < len; i++) {
arr[i] = arr[i + 1];
}
arr.length = len;
}
}
JSFiddle для моей функции иногда быстрее, иногда медленнее... Должен ли я уделять больше внимания повышению производительности и ухудшению памяти или улучшению памяти и снижению производительности?
Какие существуют другие способы избежать использования Array.splice
?
1 ответ
Вы должны понять, как jsperf выполняет ваш код. Он не запускает установку каждый раз, когда запускает ваш код - код запускается сотни или тысячи раз для каждой установки.
Это означает, что вы используете пустой массив для 99,999999% вызовов и, следовательно, не измеряете ничего полезного.
Вы можете, по крайней мере, получить какой-то смысл из этого, измерив его следующим образом: http://jsperf.com/splice-vs-own-function/2 однако вы должны заметить, что выделение массива в 50 раз может притупить различия и что ваш метод, следовательно, на самом деле намного быстрее, чем может показать тест.