検討:
- (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
そのコストに見合った「付加価値」とは何か?