0

Objects in JavaScript contain key-value pairs. The cost of a typical pair (using DevTools Profiler) is a reference to the key name, 8 bytes, and the cost of the object: 4 bytes for small ints, 8 bytes for numbers, references, etc.

The cost of the keys add up, especially in arrays with millions of objects.

Is there a asm.js sort of way to use typed arrays for arrays of identical objects?

Yes, I know this seems like a pain, but for a particular project, this may be required.

The sort of approach I'm thinking of is using a template JS object who's keys describes the offset into a typed array for each key's value, along with its type. For arrays of these objects, there'd be multiple of these object spans.

Thus two questions:

1 - Are my assumptions correct .. and there is no optimization in chrome/modern browsers that optimize the key costs? Possibly with constraints used here: http://www.2ality.com/2013/08/protecting-objects.html

2 - If so, is there a library for handling typed arrays as objects? Or any articles or gists etc?

4

1 回答 1

1

如果您有数以百万计的对象,所有对象都具有相同的一组已知键,并且您拥有如此多的对象以至于内存是一个问题,那么您可能根本不想将数据存储为 javascript 对象。

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

  1. 一种半紧凑的存储格式
  2. 一种在存储格式中找到正确记录的方法(这取决于数据是什么以及您需要如何访问它。
  3. 一种读取半紧凑存储格式并将其转换为实时 javascript 对象的方法,仅当您想在代码中实际使用该对象时。
  4. 一种将更改写回半紧凑存储格式的方法。

例如,如果您有七个键(例如字段),三个是数字,四个是字符串,其中一个数字是您的查找键,那么您可以这样做:

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

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

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

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

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

如果这些假设中的任何一个不正确,则必须对设计进行调整以处理该问题,但希望您能想到使用大型对象数组以外的东西来存储数据,然后仅在以下情况下构成给定对象您需要使用该记录的数据。

于 2013-11-14T17:08:47.563 回答