使用对象和键迭代 NSArray 的最快方法

Posted

技术标签:

【中文标题】使用对象和键迭代 NSArray 的最快方法【英文标题】:Fastest way to iterate through an NSArray with objects and keys 【发布时间】:2010-03-31 01:50:03 【问题描述】:

我在下面有一个名为“objects”的 NSArray,arrayCount = 1000。遍历这个数组大约需要 10 秒。有没有人有更快的方法来遍历这个数组?

for (int i = 0; i <= arrayCount; i++) 
    event.latitude = [[[objects valueForKey:@"CLatitude"] objectAtIndex:i] floatValue];
    event.longitude = [[[objects valueForKey:@"CLongitude"] objectAtIndex:i] floatValue];

【问题讨论】:

【参考方案1】:

迭代 NSArray 的最快方法是使用 fast enumeration。我的情况是:

for (id object in objects) 
    event.latitude = [[object valueForKey:@"CLatitude"] floatValue];
    event.longitude = [[object valueForKey:@"CLongitude"] floatValue]

【讨论】:

【参考方案2】:

看起来 valueForKey 返回的数组在每次迭代时都是相同的,因此请尝试在循环外获取对它们的引用:

NSArray *latitudes = [objects valueForKey:@"CLatitude"];
NSArray *longitudes = [objects valueForKey:@"CLongitude"];
for (int i = 0; i <= arrayCount; i++) 
    event.latitude = [[latitudes objectAtIndex:i] floatValue];
    event.longitude = [[longitudes objectAtIndex:i] floatValue];

但是循环的意义何在?最后,不就是将事件属性设置为两个数组中的最后一个值吗?另外,如果 arrayCount 是元素的数量,那么循环应该是 i &lt; arrayCount 而不是 i &lt;= arrayCount

【讨论】:

【参考方案3】:

加上其他人在这里所说的,快速枚举更快,因为它迭代 C 数组,而使用 objectAtIndex: 访问索引具有 Objective C 对象消息传递的开销。可以将其视为一次向 NSArray 对象询问其所有内容,而不是单独询问每个对象。

enumerateObjectsUsingBlock: 方法几乎一样快。块可以很强大,因为您可以将一块代码分配给一个变量并传递它。

我一直在寻找实际的基准并发现了这个:

http://darkdust.net/writings/objective-c/nsarray-enumeration-performance

【讨论】:

以上是关于使用对象和键迭代 NSArray 的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 迭代大表的最快方法

在 Java Spark 中迭代大型数据集的最快且有效的方法

如何以任何顺序比较两个 NSArray 的相同内容?

NSArray其中的方法--遍历,

迭代文件系统的最快方法

OC4(数组)