技术解析

关于 JS 中内存分配的问题
0
2021-08-12 04:07:20
idczone

小白求问,JS 中似乎不存在底层操作的接口,所以如果我想实现一定数量的对象在内存中分配连续是不可能的对吧?


数组?

arraybuffer,dataview 什么的?这些 api 是比较底层的,可以看看文档

我的理解,数组存放的只是对象的引用吧,并不代表对象真实存在的位置?

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
ArrayBuffer 创建出来的缓冲区是连续分配的内存。

我想存放的是对象,譬如某个类创建的一些实例。似乎转 buffer 不大行,而且我需要不断的读取实例中的属性或者方法。

你要放到连续内存里就肯定要自己手动做序列化啊,比如知道每个属性的内存点用,记录一张 offset 表,从 ArrayBuffer 里用 offset 去读属性再形成对象
而且我们依然不知道你的原始需求是什么,内存连续分配只是一种手段吧

大佬大佬

嗯,只是想探索一下工作中系统架构中各类数组遍历的效率。实际远没有达到瓶颈,只是思考到这个问题

那应该自己造内存效率也高不过标准数组,因为要处理序列化进去和反序列化出来的逻辑,除非所有的逻辑不持有对象,而是直接通过 offset 去读 ArrayBuffer

感谢,的确序列化是一个问题,看来这种方式不大可行。

最近刚好写了一篇关于 Js Array 的.
http://blog.codermagefox.com/post/zhkaug/
感觉我这一篇应该能解决你的困惑.
欢迎探讨.

hashmap 和存对象没关系吧。。

嗯,别的数据结构也能存,只是说明是 HashMap 而已.

如果需要优化到这个程度,可以看看 WebAssembly

可以考虑 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
应该能解决你的大部分问题

你想精准控制内存,就得直接控制内存芯片,最接近这个目标的可能是单片机。
JS 的内存管理被抽象出了几层,比如 JS 引擎有自己的“内存”管理机制,运行引擎的操作系统也有自己的“内存”管理机制,操作系统运行的硬件系统也有自己的内存管理机制。你在 JS 层去看内存情况只能看到 JS 引擎抽象出来的内存情况,在 JS 引擎层看也只能看到操作系统给 JS 引擎抽象出来的内存空间情况。
CPU 通常不会直接用内存数据进行计算,而是会经过有多级缓存,最终到达 CPU 的寄存器再真正执行计算,而多级缓存、寄存器的情况和使用方式也都影响计算效率。
JS 是一种抽象程度很高的语言,不同 JS 引擎的底层实现有差别,可能会为了优化执行效率、内存占用量玩各种内存优化,而且现代 JS 引擎的执行效率极高,完全能满足绝大多数业务场景,而且如今做极致性能优化的成本可能会高于性能浪费的成本,所以有时候加硬件是更经济的方案。
在操作系统级别有对计算和存储性能较高的要求,可以考虑使用 WebAssembly 方案,使用 C\C++\Rust 等系统开发语言写高性能程序,然后通过 WebAssembly 技术与 JS 程序交互。如果使用 Node.js 还可以考虑 N-API 方案。

在摸不到内存的环境中 什么是”在内存中连续“?
不如直接说 X 问题

不可以.你看 v8 源码可以知道.数组在内存中连续与否是有 js 引擎决定的. 语言中的数组虽然只有 Array 但是在 native code 中是有 快慢数组实现的 快数组在内存中连续 慢数组用于存储数据类型不同的数据 是 HashTable

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服