Выделение памяти для одних и тех же объектов в разных массивах - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь понять, как JS движки, такие как V8, обрабатывают объекты в массивах и, в частности, как распределяется память и насколько она эффективна.

У меня есть массив, в котором объекты не отсортированы, и я создаю массив, содержащий те же самые объекты в отсортированном массиве

let obj1 = {'test': 'test1'};
let obj2 = {'test': 'test2'};
let obj3 = {'test': 'test3'};

let arr1 = [obj1,obj3,obj2];

...Do sorting and create a new array (no I don't want to destroy the previous)
let arr2 = [obj1,obj2,obj3];

Являются ли накладные расходы памяти только ссылками, созданными между индексами и объектами, или я фактически дублирую объекты в пространстве памяти?

1 Ответ

1 голос
/ 01 мая 2020

В Spidermonkey, движке Mozilla, массив объектов будет представлен массивом C ++ jsval. jsval - это 64-битные величины, которые при представлении JS объектов фактически являются указателями.

Таким образом, ответ на ваш вопрос заключается в том, что базовое представление - это в основном массив указателей, что примерно так же эффективно, как и вы. можно получить.

Я говорю «в основном», потому что, как только вы начнете создавать массив с большими разреженными пробелами, нечисловыми свойствами или множеством других вещей - движок будет де-специализировать его и в основном хранить это как объект внутри.

Я не читал эту часть исходников v8, но я уверен, что реализация похожа. Делать это так же очевидно, как только вы окажетесь там, и оба механизма работают довольно близко друг к другу с точки зрения доступа к свойствам массива.

...