如何使用类型化数组来模拟对象?

时间:2013-11-13 18:52:37

标签: javascript arrays object memory

JavaScript中的对象包含键值对。典型对的成本(使用DevTools Profiler)是对密钥名称,8个字节和对象成本的引用:小字节为4个字节,数字为8个字节,引用等。

密钥的成本加起来,特别是在拥有数百万个对象的数组中。

是否有一种asm.js方法可以为相同对象的数组使用类型化数组?

是的,我知道这似乎很痛苦,但对于某个特定项目,这可能是必需的。

我正在考虑的那种方法是使用模板JS对象,其中的键描述了每个键值的类型化数组的偏移量及其类型。对于这些对象的数组,这些对象跨度中有多个。

因此有两个问题:

1 - 我的假设是否正确..并且Chrome /现代浏览器中没有优化关键成本的优化?可能会使用限制:http://www.2ality.com/2013/08/protecting-objects.html

2 - 如果是这样,是否有一个用于处理类型化数组作为对象的库?或者任何文章或要塞等?

1 个答案:

答案 0 :(得分:1)

如果您拥有数百万个对象,所有对象都具有相同的已知密钥集,并且您有很多对象,那么内存是个问题,那么您可能根本不希望将数据存储为javascript对象。

您可能希望将此视为数据库问题。你想要:

  1. 半紧凑存储格式
  2. 以存储格式查找正确记录的方法(这取决于数据是什么以及您需要如何访问它。
  3. 只有当您想在代码中实际使用该对象时,才能阅读半紧凑存储格式并将其转换为实时javascript对象。
  4. 一种将更改写回半紧凑存储格式的方法。
  5. 例如,如果您有七个键(例如字段),其中三个是数字,四个是字符串,其中一个数字是您的查找键,那么您可以这样做:

    • 创建三个类型化数组(每个数值一个)
    • 创建一个常规数组。这将保留所有字符串值与唯一分隔符连接在一起。
    • 创建主密钥查找对象

    当您阅读数据时,可能来自多个ajax调用,您可以执行以下操作:

    • 请注意您的某个阵列的长度(它们的长度都相同),因为这将是您的新记录号。
    • 将查找键添加到主密钥对象,并将密钥的值设置为记录号。
    • 将每个数值添加到每个类型化数组(每个数组都是数组中的记录号索引)
    • 按键顺序将所有字符串值与它们之间的分隔符连接起来,然后将contactenated字符串值放入字符串数组中。

    现在您拥有半紧凑的存储格式和密钥查找方式。如果要查找值,请使用主密钥查找对象。键的值将是记录号,它是其他数组的索引。您可以创建两个函数来查找记录并返回记录的javascript对象形式(对象上的键/值对中的所有数据)和另一个将写入对象的函数(可能已更改=但主密钥可以不要改回你的存储格式。

    这对您的数据做了一些假设,即您有一个主密钥不会改变您用于查找的主密钥,并且您可以找到一个分隔符将所有字符串值绑定在一起,然后将它们分开,然后将它们分开你可以知道什么时候去存储所有这些,并且知道键是什么,并且对象通常都具有相同的键。

    如果这些假设中的任何一个都不正确,那么设计就必须进行调整以处理它,但希望你能想到使用除了巨大的对象之外的东西来存储你的数据然后构成一个给定的仅当您需要处理该记录的数据时才对象。