我正在使用iPhone应用程序进行调试/优化阶段。我还有一个瓶颈 - 程序有明显滞后的唯一地方,它在下面的循环中:(顺便说一句,我已经用字母和类型重命名了变量。(实名更加人性化)在实际的应用程序中,但在上下文中没有任何意义,所以我希望这很清楚。)这是循环:
for(i=0;i<xLong; i+=yFloat*zShort){
aFloat=0.0;
for(int j=i;j<i+yFloat*zShort;j++){
aFloat=hArray[j]/kFloat;
}
bNSNumber = [NSNumber numberWithFloat:aFloat];
[cNSMutableArray addObject:bNSNumber];
}
所有异议创建和清理都在此循环之外。
(这应该是非常直接的,这里发生了什么,但基本上我有一个非常大的数组(数以百万计),我将在yFloat * zShort长度的块中经历该数组,添加所有元素chunk,并将最终总和插入另一个数组。所以如果hArray是一个百万元素长,而我的块长度是200,我将总结前200个元素,在cNSMutableArray中插入该总数,然后继续下一个200个元素在hArray中。最后,cNSMutableArray的长度为5000个元素。)
当外循环大约为25k且内循环大约为200时,此代码大约需要4秒才能运行。我肯定希望尽可能地减少这种情况,就像在现实世界中一样,外环可能要大得多。
任何想法如何加快这一点?
感谢您的任何想法!
答案 0 :(得分:8)
您是否尝试制作C样式的float数组而不是使用NSMutableArray?创建那么多包装器(NSNumber)的开销可以加起来。
答案 1 :(得分:6)
首先,从您的描述中看起来内部循环应该是:
for(int j=i;j<i+yFloat*zShort;j++){
aFloat+=hArray[j]/kFloat;
}
无论如何,由于kFloat没有改变,你可以将其移出循环并进行一次除法:
for(int j=i;j<i+yFloat*zShort;j++){
aFloat+=hArray[j];
}
aFloat/=kFloat;
也就是说,这会影响最终值的准确性。如果不确切知道你在做什么,我不知道这是否重要。
答案 2 :(得分:2)
我看到你已经有了一个很好的加速,但这是我的两分钱:浮点分区是出了名的昂贵;你可以预先计算
float invKFloat = 1.0f / kFloat;
然后多了多少而不是用kFloat划分。这意味着你只需要进行一次除法,而不是每次都在外循环中进行。
答案 3 :(得分:0)
这似乎应该在后台线程中分离出来的那种计算。
你有几个选择 - NSOperation是一个可行的选择,但根据你的数据结构,使用detachNewThreadSelector可能更容易:toTarget:withObject:
答案 4 :(得分:0)
你真的想避免在紧密循环中创建对象。每次执行此操作时,都会在堆上分配一个新对象,其中包含一个哈希插入。