Какую структуру нужно использовать для хранения данных, которые быстро добавляются и удаляются?
Есть большое количество объектов (~10000+), в которые в произвольном порядке могут добавляться около 50 заранее известных новых свойств (с разными значениями). Когда свойство уже использовано и больше не нужно, оно удаляется через delete
* В частности, такое сложилось в игре: Система боевых эффектов персонажей, при размене ударов раз в пару секунд, у всех ботов регулярно включаются / выключаются разные эффекты.
Если искать в гугле что-то вроде «js engine optimization» можно найти статьи ( пример-1, пример-2 ), где утверждается, что при создании объектов используется механизм "hidden class":
function Point(x, y) {
this.x = x;
this.y = y;
}
var p1 = new Point(1, 2);
p1.a = 5;
p1.b = 6;
var p2 = new Point(3, 4);
p2.b = 7;
p2.a = 8;
JS создает один скрытый класс для p1, и другой - для p2, т.к. свойства a и b добавляются в разном порядке. Соответственно, рекомендуется изначально добавлять все свойства в одинаковом порядке.
Отсюда вопросы:
- Есть ли у этого механизма какие-то ограничения по максимальному количеству созданных классов? Очевидно, для 50 свойств физически невозможно создать
50!классов. (или я не так понял, как это работает?) - Создавать объекты с одинаковыми, но пустыми свойствами, а вместо delete, давать им значения null / undefined — Хорошо или плохо? Изначально казалось, что используя delete, освобождаю память от лишних свойств. А на деле получается, это только забивает его - созданием новых скрытых классов, при добавлении новых свойств?
Ответы (1 шт):
- "Когда свойство создается динамически, или свойство удаляется или изменяется, создается другой скрытый класс.". То есть каждый раз когда свойство создается динамически создается класс то есть сколько свойств только и классов (вообще создается класс не только при создании свойства но и изменении и удалении, но так будет проще) по этому лимитов практически нету (уж точно не меньше чем свойств).
- Присваивать значения null / undefined и delete это одно и тоже. Вообще для небольших массивов / объектов delete подходит тем что можно будет использовать метод filter что бы вычистить его от всего лишнего, но в случае с большим массивом / объектом (~10000+) этот способ не подходит. И да это только больше забивает память вместо очищения.