关于 JS 中内存分配的问题

2020-10-21 09:46:27 +08:00
 lamada

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

2596 次点击
所在节点    JavaScript
18 条回复
winterbells
2020-10-21 09:48:38 +08:00
数组?
KuroNekoFan
2020-10-21 09:50:41 +08:00
arraybuffer,dataview 什么的?这些 api 是比较底层的,可以看看文档
lamada
2020-10-21 09:50:44 +08:00
@winterbells 我的理解,数组存放的只是对象的引用吧,并不代表对象真实存在的位置?
Curtion
2020-10-21 09:52:00 +08:00
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer

ArrayBuffer 创建出来的缓冲区是连续分配的内存。
lamada
2020-10-21 09:54:17 +08:00
@Curtion 我想存放的是对象,譬如某个类创建的一些实例。似乎转 buffer 不大行,而且我需要不断的读取实例中的属性或者方法。
otakustay
2020-10-21 09:59:14 +08:00
你要放到连续内存里就肯定要自己手动做序列化啊,比如知道每个属性的内存点用,记录一张 offset 表,从 ArrayBuffer 里用 offset 去读属性再形成对象
而且我们依然不知道你的原始需求是什么,内存连续分配只是一种手段吧
chogath
2020-10-21 10:01:47 +08:00
大佬大佬
lamada
2020-10-21 10:04:01 +08:00
@otakustay 嗯,只是想探索一下工作中系统架构中各类数组遍历的效率。实际远没有达到瓶颈,只是思考到这个问题
otakustay
2020-10-21 10:16:53 +08:00
@lamada 那应该自己造内存效率也高不过标准数组,因为要处理序列化进去和反序列化出来的逻辑,除非所有的逻辑不持有对象,而是直接通过 offset 去读 ArrayBuffer
lamada
2020-10-21 10:21:33 +08:00
@otakustay 感谢,的确序列化是一个问题,看来这种方式不大可行。
codermagefox
2020-10-21 10:47:30 +08:00
最近刚好写了一篇关于 Js Array 的.
http://blog.codermagefox.com/post/zhkaug/

感觉我这一篇应该能解决你的困惑.

欢迎探讨.
shyling
2020-10-21 10:54:41 +08:00
@codermagefox hashmap 和存对象没关系吧。。
codermagefox
2020-10-21 10:55:43 +08:00
@shyling #12 嗯,别的数据结构也能存,只是说明是 HashMap 而已.
cmdOptionKana
2020-10-21 11:13:15 +08:00
如果需要优化到这个程度,可以看看 WebAssembly
codermagefox
2020-10-21 11:27:27 +08:00
libook
2020-10-21 11:40:48 +08:00
你想精准控制内存,就得直接控制内存芯片,最接近这个目标的可能是单片机。

JS 的内存管理被抽象出了几层,比如 JS 引擎有自己的“内存”管理机制,运行引擎的操作系统也有自己的“内存”管理机制,操作系统运行的硬件系统也有自己的内存管理机制。你在 JS 层去看内存情况只能看到 JS 引擎抽象出来的内存情况,在 JS 引擎层看也只能看到操作系统给 JS 引擎抽象出来的内存空间情况。

CPU 通常不会直接用内存数据进行计算,而是会经过有多级缓存,最终到达 CPU 的寄存器再真正执行计算,而多级缓存、寄存器的情况和使用方式也都影响计算效率。

JS 是一种抽象程度很高的语言,不同 JS 引擎的底层实现有差别,可能会为了优化执行效率、内存占用量玩各种内存优化,而且现代 JS 引擎的执行效率极高,完全能满足绝大多数业务场景,而且如今做极致性能优化的成本可能会高于性能浪费的成本,所以有时候加硬件是更经济的方案。

在操作系统级别有对计算和存储性能较高的要求,可以考虑使用 WebAssembly 方案,使用 C\C++\Rust 等系统开发语言写高性能程序,然后通过 WebAssembly 技术与 JS 程序交互。如果使用 Node.js 还可以考虑 N-API 方案。
momocraft
2020-10-21 11:48:46 +08:00
在摸不到内存的环境中 什么是”在内存中连续“?

不如直接说 X 问题
yaphets666
2020-10-21 15:23:55 +08:00
不可以.你看 v8 源码可以知道.数组在内存中连续与否是有 js 引擎决定的. 语言中的数组虽然只有 Array 但是在 native code 中是有 快慢数组实现的 快数组在内存中连续 慢数组用于存储数据类型不同的数据 是 HashTable

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/716945

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX