【发布时间】:2016-12-20 09:34:01
【问题描述】:
我正在使用.reduce 方法遍历对象数组,以便返回最适合特定条件的对象的数组索引。我的数组现在有大约 30,000 个索引,而且我的目标是超过一百万。麻烦的是,使用.reduce 遍历数组需要永远!!!我们现在谈了将近 4 秒,想象一下如果数组有我预计的 100 万个索引。阵列紧凑。我没有连接到数据库或服务器。这是我的代码:
var startMatchMaking = function () {
var loopCounter = 0;
var length = personArray.length;
do {
var manCounter = 0;
loopCounter++;
for (var i = length; i--;){
if (!personArray[i].isSingle && personArray[i].sex === "Male" &&
personArray[i].isAvailable === true) {
manCounter++;
var num = normalRandomScaled(2.1, 12.44);
var result = personArray.reduce(function(p,c,k,a){
return c.sex !== personArray[i].sex &&
!c.isSingle && c.isAvailable === true &&
c.age <= (personArray[i].age + num) &&
c.age >= (personArray[i].age - num) ? k : p;
}, 0);
result = !personArray[result].isSingle &&
personArray[result].sex !== personArray[i].sex &&
personArray[result].age <= (personArray[i].age + num) &&
personArray[result].age >= (personArray[i].age - num) ? result : -1;
if (result >= 0) {
householdArray.push (new Household (personArray[i], personArray[result]));
personArray[result].isAvailable = false;
personArray[i].isAvailable = false;
}
}
}
document.write("<br>Mancounter is: " + manCounter +
" loopCounter is: " + loopCounter + " households: " + householdArray.length);
}
while (manCounter > 0 && loopCounter <= 5);
};
startMatchMaking();
上下文:我正在尝试开发一个独立的应用程序来运行基于代理的模型人口统计模拟。 personArray 基本上包含 30,000 个人。上面的特定代码位与种群的初始设置有关。 Persons 之前已创建并推送到阵列。每个Person 对象都有一个firstName、lastName、sex、age 和isSingle 属性。他们为每个人分配了随机值。在项目的这个阶段,我需要把注定不是单身的Persons,与一个合适的异性配偶和年龄相配的人配对成家庭。
如何优化它以显着提高性能?我愿意接受小的更改或完全不同的替代方案,它们会输出相同的result。
【问题讨论】:
-
如果您在另一个循环中调用该代码,那么那是您的问题。
-
您是否正确使用reduce?好像
k被用在了一个奇怪的地方,i是从哪里来的? -
无论您对这么多数据做什么,都应该在数据库中完成,而不是使用 js。特别是因为您的代码看起来很像查询,而不是缩减。
-
好的,你去。您正在迭代
personArrray,并且在每次迭代中,您都通过.reduce()调用迭代再次。这意味着.reduce()回调将被调用九亿次。加快.reduce()回调的任何操作都无济于事。 -
基本上@Pointy 的意思是:在您使用蛮力的那一刻,您想要做的是寻找更好的聚类策略。第一步是将您的数据分成
sex, single, available类别,并仅搜索正确的类别,即消除personArray.length时间检查错误类别的开销。第二步可以按年龄范围划分这些类别。这使您可以仅搜索与您感兴趣的年龄范围相交的范围。
标签: javascript arrays performance optimization iteration