2011-08-19 44 views
5

在Objective-C中,for(;;)for(:)之间有什么不同吗?有什么好的做法可以使用for(;;)for(:)vs.对于(:)的性能和实践

+11

两个分号会冒号,所以它们完全相同。 –

+0

哈哈哈好点。我相信,像其他任何语言,如Javascript和C#可能会有一些性能差异。 –

+1

这对于为每个循环风格构建测试用例并执行一些分析运行来说非常简单。 –

回答

11

我假定在每种情况下你都枚举了一个对象集合,因为只有C for(;;)表单允许枚举基本类型。 for(in)构造使用名为NSFastEnumeration的协议来填充缓冲区,以便在将来的迭代中使用对象,并使用光标来跟踪它的起始对象。这使得它的速度比:

NSEnumerator *e = [collection objectEnumerator]; 
while (id o = [e nextObject]) { 
    //... 
} 

这需要一个每次迭代消息发送,它的速度比:

for (NSInteger i=0; i < [collection count]; i++) { 
    id o = [collection objectAtIndex: i]; 
    //... 
} 

这也需要每次迭代一个消息发送[*]。构造for(in)只需要在缓冲区每次干燥时发送消息,这可能每8次迭代一次。

请注意,还有基于块的循环,[collection enumerateObjectsUsingBlock: ^(id obj, int idx, BOOL *stop){/*...*/}];又有不同的属性。特别是可以告诉采用选项的这种结构的版本同时执行这些块。 [*]注意读者会注意到,这实际上要求每个迭代消息发送两个,因为每次都会评估终止条件;然而,将这些消息简化为一条消息发送很容易,因此我们将其视为本次讨论的一个消息。