tgoop.com/misha_writes_code/182
Last Update:
В 2014 году браузер Google Chrome перешел с 32-битной архитектуры на 64-битную. Это улучшило скорость работы и безопасность, но в то же время увеличило потребляемую память, поскольку внутри движка V8 объекты JS представляют из себя объекты C++. А плюсовые объекты в свою очередь аллоцированы на куче, что означает, что с каждым JS объектом связан хотя бы один указатель, а размер указателя вырос с 4 байт до 8 при переходе на 64-битную архитектуру. Таким образом каждый (ну или почти каждый) объект JS стал больше на 4 байта просто на ровном месте.
В блоге разработчиков V8 есть очень подробная статья про то, как они боролись с возросшим потреблением памяти и к каким хитростям прибегали:
https://v8.dev/blog/pointer-compression
TLDR; Используется сжатие указателей. То есть вместо самого указателя хранится смещение относительно некоторого базового сегмента памяти, из-за чего образуется кусок памяти, для доступа к которому можно использовать более маленькие указатели (32 бита).
Кстати, там еще есть интересный момент с оптимизацией. Smi или Small Integer - специальный тип, унаследованный от указателя.
Smi представляет собой 31-битное целое число в 32-битной системе и 63-битное целое число в 64-битной системе, где оставшийся бит используется для хранения информации о том, что это Smi, а не указатель на объект. Для работы с небольшими числами (в циклах или индексах массивов) используются как раз Smi - это позволяет сильно сэкономить память на создании полноценных объектов.
BY Миша пишет код
Share with your friend now:
tgoop.com/misha_writes_code/182