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 · 2741 次点击
    这是一个创建于 1496 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    18 条回复    2020-10-21 15:23:55 +08:00
    winterbells
        1
    winterbells  
       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   ·   实用小工具   ·   1173 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 18:39 · PVG 02:39 · LAX 10:39 · JFK 13:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.