最佳阵列设置

时间:2015-03-05 11:55:11

标签: javascript arrays optimization

问题

  • 我有几个数组,每个数字都是0,1或2中的任意一个。

e.g:

array1 = [0,0,0,0,1,2,2,2,2,0,2,2,0,1,..etc]
array2 = [1,1,1,1,1,1,2,2,2,2,0,2,2,1,..etc]
  • 我想测试相关性,所以理想情况下,这些数组中的每个元素都应该有两个属性:

    • 数据:0,1或2
    • 指向另一个数组的指针(如果数据匹配相同的索引,或者为null)
  • 我不喜欢直接复制,但这不是必须的。


我的尝试1

我想过将数组中的每个元素转换为Object

{
  data: 0,   // or 1 or 2
  pointer: other_array[some_index].data
}

(我希望blah.data返回一个指针,而不是数据)

但这感觉它会减慢数据的检索速度,因为它们现在可能分散在非连续的内存中。

我的尝试2

我没有使用Object数据,而是认为我将每个数组转换为两个关联数组:

my_array = {
   data_array: [0,1,2,2,2,2,1,1,1,1,1,2,2,2],
   pter_array: [o_a.data_array[0], o_a.data_array[1], o_a.data_array[2], ... ]
};

(其中o_a是some_array)

这种方式似乎data_array至少会更连续,并且检索有望更快,但我的指针数组可能不是指针。


问题:

  • 哪种实施更好?第二次尝试是否比第一次更快?
  • JS似乎只有64位数字类型。当一个字节超过时,我使用64位浮点数来存储我的数字吗?
    • 鉴于我的数据不超过3个不同的值,实现enum(通过bools?)会更高效,还是会浪费与JS数字类型一样多的空间?< / LI>

1 个答案:

答案 0 :(得分:2)

第一次尝试是明确有意义的:它在逻辑上对相关信息进行分组。第二个没有。

这可能只是一个美学问题,但根据您的使用情况,它可能会变得更多。例如,如果您需要删除或插入元素,该怎么办?您的第二次尝试需要重复操作,以确保两个阵列保持同步。

你担心表现,但目前尚不清楚原因。你是否真的创造了表现不佳的代码,或者这只是推测?

我的建议是:

  • 使用逻辑上正确的设计(尝试1)。
  • 在实际出现问题时解决性能问题。

没有特别的理由认为对象方法效率低下。你可以创建这些对象的数组,因此它并不意味着所有东西都会分散在非连续的内存中。#/ p>

如果