这个循环可以优化吗?

时间:2010-01-02 07:13:54

标签: iphone objective-c cocoa optimization

我正在使用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秒才能运行。我肯定希望尽可能地减少这种情况,就像在现实世界中一样,外环可能要大得多。

任何想法如何加快这一点?

感谢您的任何想法!

5 个答案:

答案 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)

你真的想避免在紧密循环中创建对象。每次执行此操作时,都会在堆上分配一个新对象,其中包含一个哈希插入。