最佳阵列设置
Optimal array setup
问题
- 我有几个数组,每个数组有 2000 个数字,它们是 0、1 或 2 中的任何一个。
例如:
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
- 指向另一个数组的指针(如果数据匹配相同的索引,或者为空)
我不想直接复制,但这不是必须的。
我的尝试1
我想到了将数组中的每个元素都转换成一个对象
{
data: 0, // or 1 or 2
pointer: other_array[some_index].data
}
(我希望 blah.data returns 是指针而不是数据)
但这感觉会减慢数据的检索速度,因为它们现在可能分散在不连续的内存中。
我的尝试2
我想将每个数组转换为两个关联数组,而不是使用对象数组:
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 是一些 other_array)
这样看起来 data_array 至少会更连续,并且检索速度有望更快,但我的指针数组可能不是指针。
问题:
- 哪个实现更好?第二次尝试是否比第一次更快?
- JS好像只有64位数字类型。我是否 必须 使用 64 位浮点数来存储我的数字,而一个字节却不够用?
- 鉴于我的数据不超过 3 个不同的值,实现
enum
(通过布尔值?)会不会更有效,或者会像 space 一样浪费JS 数字类型?
第一次尝试显然是有意义的:它在逻辑上对相关信息进行了分组。第二个没有。
这可能只是一个美学问题,但根据您的用例,它可能会变得更复杂。例如,如果您需要删除或插入一个元素怎么办?您的第二次尝试将需要重复操作以确保两个阵列保持同步。
您担心性能问题,但不清楚原因。您是否真的创建了性能不佳的代码,或者这只是猜测?
我的建议是:
- 使用逻辑上正确的设计(尝试 1)。
- 在实际成为问题时解决性能问题。
没有特别的理由假设对象方法效率低下。您可以将这些对象组成一个数组,所以这并不意味着所有内容都是 "scattered in non-contiguous memory".
如果性能 是 一个问题,请退后一步,对设计进行更广泛的考虑,而不仅仅是这个问题。
问题
- 我有几个数组,每个数组有 2000 个数字,它们是 0、1 或 2 中的任何一个。
例如:
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
- 指向另一个数组的指针(如果数据匹配相同的索引,或者为空)
我不想直接复制,但这不是必须的。
我的尝试1
我想到了将数组中的每个元素都转换成一个对象
{
data: 0, // or 1 or 2
pointer: other_array[some_index].data
}
(我希望 blah.data returns 是指针而不是数据)
但这感觉会减慢数据的检索速度,因为它们现在可能分散在不连续的内存中。
我的尝试2
我想将每个数组转换为两个关联数组,而不是使用对象数组:
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 是一些 other_array)
这样看起来 data_array 至少会更连续,并且检索速度有望更快,但我的指针数组可能不是指针。
问题:
- 哪个实现更好?第二次尝试是否比第一次更快?
- JS好像只有64位数字类型。我是否 必须 使用 64 位浮点数来存储我的数字,而一个字节却不够用?
- 鉴于我的数据不超过 3 个不同的值,实现
enum
(通过布尔值?)会不会更有效,或者会像 space 一样浪费JS 数字类型?
- 鉴于我的数据不超过 3 个不同的值,实现
第一次尝试显然是有意义的:它在逻辑上对相关信息进行了分组。第二个没有。
这可能只是一个美学问题,但根据您的用例,它可能会变得更复杂。例如,如果您需要删除或插入一个元素怎么办?您的第二次尝试将需要重复操作以确保两个阵列保持同步。
您担心性能问题,但不清楚原因。您是否真的创建了性能不佳的代码,或者这只是猜测?
我的建议是:
- 使用逻辑上正确的设计(尝试 1)。
- 在实际成为问题时解决性能问题。
没有特别的理由假设对象方法效率低下。您可以将这些对象组成一个数组,所以这并不意味着所有内容都是 "scattered in non-contiguous memory".
如果性能 是 一个问题,请退后一步,对设计进行更广泛的考虑,而不仅仅是这个问题。