В сценарии А я просто установил свойства в неопределенное значение. В сценарии Б я использую оператор удаления, чтобы полностью удалить их.
Код: Выделить всё
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');
Мои технические знания и путаница: я знаю о скрытых классах (картах) V8 и встроенном кэшировании. Моя гипотеза заключается в том, что удаление вызывает переход в режим словаря (хеш-таблицу), который обходит оптимизированные пути доступа JIT.
Однако у меня есть несколько конкретных вопросов, которые я не смог найти в документации V8:
- Является ли этот переход в режим словаря постоянным на протяжении всего жизненного цикла этого объекта, или V8 может повторно оптимизировать его обратно в скрытый класс, если объект остается стабильный?
- Почему существует такая значительная разница между delete и undefine, если конечное количество активных ключей одинаково?
- Существует ли современный флаг V8 или внутренний инструмент (например, --allow-natives-syntax) для подтверждения того, что объект был «деоптимизирован» для словаря?
Подробнее здесь: https://stackoverflow.com/questions/798 ... grade-perf
Мобильная версия