iOS开发性能最佳实践系列之——集合遍历

场景一

场景条件

  • 需要按顺序
  • 同步执行

使用建议:

  • for..in (NSFastEnumeration)
    * enumerateObjectsUsingBlock
    * 经典for循环

推荐原因:
在集合元素“1000000”量级上,for in效率比经典for循环要高50倍。集合内元素较少时,经典for循环效率比forin要高1倍。但for in代码可读性和安全性更高,综合考虑建议使用用for in.

场景二

场景条件

  • 需要按顺序
  • 同时需要key和value

按顺序优先考虑下列方法
* enumerateKeysAndObjectsUsingBlock
* 经典for循环

推荐原因:
在集合元素”100“量级和“1000000”量级时,enumerateKeysAndObjectsUsingBlock的效率都比“经典for循环”要高,而且不会出现“off-by-one errors”错误。建议需要key、vlaue时使用enumerateKeysAndObjectsUsingBlock

场景三

场景条件

  • 处理比较耗时
  • 不需要按顺序

按顺序优先考虑下列方法

  • enumerateObjectsWithOptions (NSEnumerationConcurrent)
    * dispatch_apply(Concurrent)

推荐原因:
enumerateObjectsWithOptions和dispatch_apply(Concurrent)各种场景的效率都差不多,但是enumerateObjectsWithOptions可读性更强,特性也更多。建议使用enumerateObjectsWithOptions。

1
2
3
[array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
[sark doSomethingSlow];
}];

场景四

场景条件

  • 倒序遍历

按顺序优先考虑下列方法

  • enumerateObjectsWithOptions:NSEnumerationReverse
  • reverseObjectEnumerator
1
2
3
4
NSArray *strings = @[@"1", @"2", @"3"];
for (NSString *string in [strings reverseObjectEnumerator]) {
NSLog(@"%@", string);
}
1
2
3
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(Sark *sark, NSUInteger idx, BOOL *stop) {
[sark doSomething];
}];

推荐原因:
enumerateObjectsWithOptions和reverseObjectEnumerator在各量级的效率表现相似,两个方法均可使用

参考

Blacktea wechat
ex. subscribe to my blog by scanning my public wechat account
记录生活于感悟,您的支持将鼓励我继续创作!