关于 JS 中内存分配的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
lamada
V2EX    Javascript

关于 JS 中内存分配的问题

  •  
  •   lamada 2020-10-21 09:46:27 +08:00 3040 次点击
    这是一个创建于 1892 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    不如直接说 X 问题
    yaphets666
        18
    yaphets666  
       2020-10-21 15:23:55 +08:00
    不可以.你看 v8 源码可以知道.数组在内存中连续与否是有 js 引擎决定的. 语言中的数组虽然只有 Array 但是在 native code 中是有 快慢数组实现的 快数组在内存中连续 慢数组用于存储数据类型不同的数据 是 HashTable
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4556 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 03:58 PVG 11:58 LAX 19:58 JFK 22:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86