这个循环可以优化吗?

Eri*_*sen 3 iphone optimization cocoa objective-c

我正在使用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];
}
Run Code Online (Sandbox Code Playgroud)

所有异议创建和清理都在此循环之外.

(这应该是非常直接的,这里发生了什么,但基本上我有一个非常大的数组(数以百万计),我在yFloat*zShort长度的块中经历该数组,添加该块中的所有元素,并且将最终总和插入到另一个数组中.因此,如果hArray长度为百万个元素,并且我的块长度为200,我将对前200个元素求和,在cNSMutableArray中插入该总数,然后转到hArray中的下两个元素.最后,cNSMutableArray将长达5000个元素.)

当外环大约为25k且内环大约为200时,此代码运行大约需要4秒.我肯定希望尽可能地降低这一点,因为在现实世界中,外环可能会更大一些.

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

感谢您的任何想法!

Mat*_*eer 8

您是否尝试制作C样式的float数组而不是使用NSMutableArray?创建那么多包装器(NSNumber)的开销可以加起来.


R S*_*hko 6

首先,从您的描述中,它听起来像内部循环应该是:

for(int j=i;j<i+yFloat*zShort;j++){
    aFloat+=hArray[j]/kFloat;
}
Run Code Online (Sandbox Code Playgroud)

无论如何,由于kFloat没有改变,你可以将其移出循环并进行一次除法:

for(int j=i;j<i+yFloat*zShort;j++){
    aFloat+=hArray[j];
}
aFloat/=kFloat;
Run Code Online (Sandbox Code Playgroud)

也就是说,这会影响最终值的准确性.如果不确切知道你在做什么,我不知道这是否重要.