Задать вопрос
@MishaXXL

Почему зануление значения в массиве понижает производительность?

Почему для работы с массивами более производительней сохранять данные и перезаписывать их на другое значение, а не удалять?

https://habr.com/ru/companies/tensor/articles/688182/
Заметим, что ради производительности, мы не "зануляем" прочитанную ячейку массива, поэтому объект остается доступен в памяти и не может быть зачищен GC все то время, пока "хвост" не пройдет весь остальной массив и не перезапишет ячейку новым элементом.

Это побуждает нас использовать в качестве буфера как можно более короткий массив - исходя из графика задержек, 256 элементов будет достаточно эффективно.


И каким образом Object.defineProperty нам ускоряет получения значения, когда в итоге мы всё равно получаем значение путем this._buffer[this._head]?
Object.defineProperty(this, 0, {
   get : () => this._head < this._tail ? this._buffer[this._head] : undefined
});

Иногда бывает необходимо "заглянуть" в следующий элемент очереди без его извлечения - поддержим обращение queue[0] по аналогии с обычным массивом. Для этого прямо в конструкторе объявим геттер для свойства .0
Можно было бы поддержать доступ по произвольному индексу через Proxy так или так, но тогда через него пойдут и все обращения к локальным полям, что явно снизит производительность.


constructor(powMin, powMax) {
    this._MAX_BUFFER = 1 << powMax;
    this._MIN_BUFFER = 1 << powMin;
    this._buffer = Array(this._MIN_BUFFER).fill();
    this._mask = this._buffer.length - 1;
    // поддержка обращения к "следующему" (нулевому) элементу очереди
    Object.defineProperty(this, 0, {
      get : () => this._head < this._tail ? this._buffer[this._head] : undefined
    });
  }
  • Вопрос задан
  • 205 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Vitsliputsli
Почему для работы с массивами более производительней сохранять данные и перезаписывать их на другое значение, а не удалять?

Речь не про массивы, а про кольцевой буфер. Нам не нужно "удалять" элементы буфера (занулять отдельные элементы внутреннего массива), а раз не нужно, не тратим на это время.

И каким образом Object.defineProperty нам ускоряет получения значения

Речь про то, что автор накой-то хочет сделать обращение к объекту кольцевого буфера через нотацию query[0], как в массиве. В итоге делает только для 0, если для всех, то придется подменять методы, а значит в них будет больше действий, а значит будет медленней.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы