【发布时间】:2016-02-13 03:14:23
【问题描述】:
当处理一个非常大的统一(相同类型)JavaScript 对象(每个只有几列)的内存数组时...
在选择将其作为行->列与列->行进行迭代时,是否对性能和/或任何其他损失有任何影响?
示例
我们有来自 CSV 文件的 100,000 个数据行,每个数据行都是一个包含 10 个整数值的对象,我们需要触摸其中的每个值以进行特定计算。
垂直或水平遍历它会有什么不同吗?现代的 V8 对这些事情有丝毫关心吗?
var data = [...]; // array of many same-type objects;
// horizontal iteration:
for (var p in data[0]) {
for (var i = 0; i < data.length; i++) {
var value = data[i][p]; // current value;
// calculate here from the value;
}
}
// vertical iteration:
for (var i = 0; i < data.length; i++) {
for (var p in data[0]) {
var value = data[i][p]; // current value;
// calculate here from the value;
}
}
【问题讨论】:
-
如何在不遍历内部循环的行的情况下逐列遍历数组?这对我来说没有意义。列的概念在 javascript 中没有得到很好的定义。所以,是的,我可以想象的“按列”迭代的任何方法都会比按行慢得多。你能展示一些代码来解释你的意思吗?
-
@ChristianFritz:如果内部结构的成员(属性/索引)一致,则可以在外部循环中定义。如果内部结构是一个对象而外部是一个数组,我认为将对象放在外部会产生性能差异,因为
for-in迭代通常比for慢。 -
在猜测中,我认为按行可能更快。鉴于数据可能是按行而不是按列构造的,那么行的数据存储在连续的内存块中的可能性(IE:更有可能已经将行的其余数据存储在缓存中),我会猜测它会更快。只是一个想法,可能是错误的,但这是我的想法。总的来说,不会有太大的不同。
-
@ChristianFritz,我在您的问题中添加了一个示例。
-
我刚刚看到代码编辑,考虑到这一点,以及 Squint 的评论,我会选择水平迭代,只需要循环
for-innumColumns 次,如果使用垂直,则需要循环 numColumns * numRows。
标签: javascript node.js