Почему удаление свойства из объекта JavaScript значительно снижает производительность по сравнению с присвоением ему неоJavascript

Форум по Javascript
Ответить
Anonymous
 Почему удаление свойства из объекта JavaScript значительно снижает производительность по сравнению с присвоением ему нео

Сообщение Anonymous »

Я провел несколько микротестов в Node.js v20.10, чтобы понять, как V8 обрабатывает удаление свойств объекта. Я заметил огромное несоответствие в производительности — «обрыв производительности», — которое, кажется, сохраняется даже после завершения процесса удаления.
В сценарии А я просто установил свойства в неопределенное значение. В сценарии Б я использую оператор удаления, чтобы полностью удалить их.

Код: Выделить всё

const objA = {};

for (let i = 0; i < 10000; i++) objA['prop' + i] = i;

for (let i = 0; i < 5000; i++) objA['prop' + i] = undefined;

console.time('Access A');

let sumA = 0;

for (let i = 5000; i < 10000; i++) sumA += objA['prop' + i];

console.timeEnd('Access A');

const objB = {};

for (let i = 0; i < 10000; i++) objB['prop' + i] = i;

for (let i = 0; i < 5000; i++) delete objB['prop' + i];

console.time('Access B');

let sumB = 0;

for (let i = 5000; i < 10000; i++) sumB += objB['prop' + i];

console.timeEnd('Access B');
Наблюдение: время доступа к objB (после удаления) постоянно в 5–10 раз медленнее, чем к objA.
Мои технические знания и путаница: я знаю о скрытых классах (картах) V8 и встроенном кэшировании. Моя гипотеза заключается в том, что удаление вызывает переход в режим словаря (хеш-таблицу), который обходит оптимизированные пути доступа JIT.
Однако у меня есть несколько конкретных вопросов, которые я не смог найти в документации V8:
  • Является ли этот переход в режим словаря постоянным на протяжении всего жизненного цикла этого объекта, или V8 может повторно оптимизировать его обратно в скрытый класс, если объект остается стабильный?
  • Почему существует такая значительная разница между delete и undefine, если конечное количество активных ключей одинаково?
  • Существует ли современный флаг V8 или внутренний инструмент (например, --allow-natives-syntax) для подтверждения того, что объект был «деоптимизирован» для словаря?


Подробнее здесь: https://stackoverflow.com/questions/798 ... grade-perf
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»