【发布时间】:2014-12-03 17:25:13
【问题描述】:
这段代码是一种创建数组以供多个其他类使用的方法。输入是来自 CoreData 提取的数组,类型为 NSDictionaryResultType。
其中 3 个字段是我需要分解为数组的字符串,因此是 componentsSeparatedByString。
生成的数组 _dataProductionArray 运行良好 --- 但是 --- 这段代码需要整整 5 秒来处理大约 32,000 条记录。
任何帮助指出导致这种缓慢性能的明显错误将不胜感激!
NSMutableArray *dataArray = [NSMutableArray array];
int j = 0;
int maxNumMonths = 0;
for (id obj in _dictionaries) {
if ([_dictionaries[j] [@"month"] length] >0 ) {
// get production values
NSArray *aItems = [_dictionaries[j] [@"prodA"] componentsSeparatedByString:@","];
NSArray *bItems = [_dictionaries[j] [@"prodB"] componentsSeparatedByString:@","];
NSArray *monthItems = [_dictionaries[j] [@"month"] componentsSeparatedByString:@","];
NSMutableArray *productionAArray = [NSMutableArray array];
NSMutableArray *productionBArray = [NSMutableArray array];
int monthLoop = 1;
for (NSNumber *month in monthItems) {
if (monthLoop <= MONTHS_OF_PRODUCTION) {
if ([month intValue] == monthLoop) {
[productionAArray addObject:[aItems objectAtIndex:monthLoop-1]];
[productionBArray addObject:[bItems objectAtIndex:monthLoop-1]];
productionCount ++;
if (monthLoop > maxNumMonths)
maxNumMonths = monthLoop;
}
}
monthLoop++;
}
NSDictionary *arrayItem = @{@"name":_dictionaries[j] [@"name"],
@"type":[NSString stringWithFormat:@"%@",_dictionaries[j] [@"type"]],
@"height":[NSString stringWithFormat:@"%@",_dictionaries[j] [@"height"]],
@"aArray":productionAArray,
@"bArray":productionBArray,
};
[dataArray addObject:arrayItem];
}
j++;
}
_dataProductionArray = [NSArray arrayWithArray:dataArray];
【问题讨论】:
-
您在这里有几个嵌套循环,因此您可以移出循环的任何内容都将有助于您的表现。您可能想尝试在循环之外创建 productionAArray 和 productionBArray,并在其当前创建点执行 removeObjects 。我认为您的其他问题之一是您在紧密循环中创建了大量对象,这些对象在您完全完成之前不会被释放。与其循环遍历 32000 条记录,不如创建 32 个线程,每个线程只处理 1000 条记录,然后将其分段,这样最多只能运行 5 个线程。
-
5 秒记录 32,000 条记录听起来很合理。
-
感谢 Hot Licks - 这正是我所怀疑的。尝试了不同的策略进行优化,但没有什么能显着加快速度。欧文,确实尝试了一些多线程,但要么我做错了,要么就是没有帮助。当相同的代码运行几次迭代时,速度不是问题。
标签: ios objective-c arrays nsmutablearray nsdictionary