【问题标题】:fast enumeration versus enumerateObjectsUsingBlock快速枚举与 enumerateObjectsUsingBlock
【发布时间】:2013-08-04 23:46:06
【问题描述】:

考虑:

- (void) testing {
    NSMutableArray * numbers = [NSMutableArray arrayWithCapacity:10000000] ;
    for (int i = 0 ; i < 10000000 ; ++i) {
        [numbers addObject:@(i)] ;
    }

    NSInteger (^sum)(NSInteger, NSInteger) = ^(NSInteger running, NSInteger n) {
        return running + n ;
    } ;

    double start = ::CACurrentMediaTime() ;
    __block NSInteger running = 0 ;
    for (NSNumber * n in numbers) {
        running = sum(running, [n integerValue]) ;
    }
    running = 0 ;
    double end1 = ::CACurrentMediaTime() ;
    [numbers enumerateObjectsUsingBlock:^(NSNumber * n, NSUInteger idx, BOOL *stop) {
        running = sum(running, [n integerValue]) ;
    }] ;
    double end2 = ::CACurrentMediaTime() ;

    ::NSLog(@"fastEnum: %0.3f, enumUsingBlock: %0.3f", end1-start, end2-end1) ;
}

这个输出:

2013-08-05 00:38:34.852 WC[48299:a0b] fastEnum: 0.341, enumUsingBlock: 1.358

这表示enumerateObjectsUsingBlock 比常规迭代慢 4 倍左右。

什么时候使用其中一种? enumerateObjectsUsingBlock 提供的能够证明其成本合理的“附加价值”是什么?

【问题讨论】:

标签: objective-c objective-c-blocks fast-enumeration


【解决方案1】:

Matt Thompson 写了一篇great post on NSHipster,介绍了使用 Objective-C 进行迭代的多种方式。

enumerateObjectsUsingBlock 提供的附加值是给出对象的索引和NSEnumerationOptions

enum {
   NSEnumerationConcurrent = (1UL << 0),
   NSEnumerationReverse = (1UL << 1),
};
typedef NSUInteger NSEnumerationOptions;

引用马特:

除非您在迭代时确实需要数字索引,否则使用 for/in NSFastEnumeration 循环几乎总是更快。

(...)

同样,快速枚举几乎肯定会比块枚举快得多,但如果您不习惯使用块,这些选项可能会很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2015-12-10
    • 1970-01-01
    • 2023-03-03
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多