首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌套枚举中,快速枚举比for-循环慢(有测试结果)?

在嵌套枚举中,快速枚举比for-循环慢(有测试结果)?
EN

Stack Overflow用户
提问于 2012-07-11 13:42:38
回答 1查看 1.9K关注 0票数 4

我知道有相当多的话题似乎是关于完全相同的事情,但我没有找到一个真正的是我想要的。

因此,我很好奇,并希望将快速枚举的性能与NSEnumerator和for循环进行比较。(这是经常被问到的部分)

首先,我比较了快速枚举:

代码语言:javascript
复制
for(NSNumber *number in testArray)
{
    assert(number);
}

NSEnumerator:

代码语言:javascript
复制
NSEnumerator *enumerator = [testArray objectEnumerator];
NSNumber *number;
while (number = [enumerator nextObject]) 
{
    assert(number);
}

循环:

代码语言:javascript
复制
for(NSUInteger i = 0; i < [testArray count]; i++)
{
    NSNumber *number = [testArray objectAtIndex:i];
    assert(number);
}

我的testArray是一个由NSNumbers组成的数组,从0到1,000,000,我彼此运行了100次测试,并计算了每个测试的平均运行时间。

同时,我在我的iPad 2上运行了它们

结果:( 100次跑步的平均时间)

  • 0.042687s快速枚举
  • 0.582072s NSEnumerator
  • 0.627318s for-循环

正如预期的那样,快速枚举是目前最快的,而且NSEnumerator仍然比for循环快一点,但这是用于枚举退出一个大型数组的。

因此,这里有一个不太常见的问题:

实际上,我对其他方面感兴趣:数组中的枚举,用于比较数组中的每个对象。

第一次尝试使用嵌套的for-循环:

代码语言:javascript
复制
for(int i = 0; i < [testArray count]-1; i++)
{
    NSNumber *number = [testArray objectAtIndex:i];
    for(int j = i+1; j < [testArray count]; j++)
    {
        NSNumber *innerLoopNumber = [testArray objectAtIndex:j];
        assert(innerLoopNumber);
        assert(number);
    }
}

对于这些测试,我必须减少数组的大小和运行次数,以便在合理的时间内完成这些测试,因为迭代的次数当然会随着O(n^2)的增加而增加。所以我用一个5.000 NSNumbers的数组运行它们,并重复了5次测试。

结果:7.360645 s1次运行

所以我想,当然,快速枚举应该更快。但是为了避免两次比较每对元素的三角形模式,我不得不将外循环中的快速枚举和内环中的NSEnumerator混合起来

代码语言:javascript
复制
for(NSNumber *number in testArray)
{
    NSEnumerator *reverseEnumterator = [testArray reverseObjectEnumerator];
    NSNumber *innerLoopNumber = reverseEnumterator.nextObject;
    while(innerLoopNumber && ![innerLoopNumber isEqualToNumber:number])
    {
        innerLoopNumber = reverseEnumterator.nextObject;
        assert(innerLoopNumber);
        assert(number);
    }
}

令我惊讶的是,这要慢得多:18.08698 01次运行

然后,我尝试了一个混合版本,外层循环使用快速枚举,内部循环使用for -循环:

代码语言:javascript
复制
int counter = 0;
for(NSNumber *number in testArray)
{
    for(int j = counter +1; j < [testArray count]; j++)
    {
        NSNumber *innerLoopNumber = [testArray objectAtIndex:j];
        assert(innerLoopNumber);
        assert(number);
    }
    counter++;
}

结果:7.079600s 1次运行

只是略快于普通的循环。

一个地方的数字:

  • 07.360645 sfor-循环
  • 07.079600s杂交
  • 18.08698 0快速枚举

所以我想知道,为什么?快速枚举只有在“不受干扰”的情况下才能正常工作,NSEnumerator的使用是否会干扰快速枚举?还是我错过了什么,我的方法是错的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-11 13:48:39

在快速枚举循环中调用其他方法。对象-c具有非平凡的方法调用开销,因此您的问题在于嵌套循环的设置。正如您所看到的,快速枚举+ for循环比循环+ for循环更快,这里您避免了额外的方法调用。

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

https://stackoverflow.com/questions/11433994

复制
相关文章

相似问题

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