首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个循环可以优化吗?

这个循环可以优化吗?
EN

Stack Overflow用户
提问于 2010-01-02 15:13:54
回答 5查看 312关注 0票数 3

我正在使用一个iPhone应用程序进行调试/优化。我只剩下一个瓶颈--程序唯一有明显滞后的地方,它在下面的循环中:(顺便说一下,我已经用字母和类型重命名了变量。(在实际的应用程序中,真实名称更易于阅读,但脱离上下文几乎没有意义,所以我希望这一点足够清楚。)这是一个循环:

代码语言:javascript
复制
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长度的块中遍历该数组,将该块中的所有元素相加,并将最后的和插入到另一个数组中。因此,如果hArray有一百万个元素长,而我的块长度是200,我将对前200个元素求和,在cNSMutableArray中插入总和,然后在hArray中继续下200个元素。最后,cNSMutableArray的长度将为5000个元素。)

当外部循环大约为25k,内部循环大约为200时,此代码大约需要4秒才能运行。我当然希望尽可能地减少这一点,因为在现实世界中,外部循环可能会相当大。

有没有什么办法可以加快速度呢?

谢谢你的任何想法!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-02 15:21:29

首先,根据您的描述,内部循环听起来应该是:

代码语言:javascript
复制
for(int j=i;j<i+yFloat*zShort;j++){
    aFloat+=hArray[j]/kFloat;
}

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

代码语言:javascript
复制
for(int j=i;j<i+yFloat*zShort;j++){
    aFloat+=hArray[j];
}
aFloat/=kFloat;

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

票数 6
EN

Stack Overflow用户

发布于 2010-01-02 15:19:21

你有没有尝试过用C语言风格的浮动数组来代替NSMutableArray?创建那么多包装器(NSNumber)的开销会加起来。

票数 8
EN

Stack Overflow用户

发布于 2010-01-02 19:47:28

我看到您已经获得了很好的加速,但这里是我的两点意见:浮点除法是出了名的昂贵;您可以预先计算

代码语言:javascript
复制
float invKFloat = 1.0f / kFloat;

然后乘以这个,而不是除以kFloat。这意味着你只需要做一次除法,而不是每次在外部循环中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1990858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档