我知道如果你有一个循环来修改循环中项目的计数,在集合上使用NSEnumerator是确保代码爆炸的最佳方法,但是我想了解NSEnumerator类之间的性能权衡而且只是一个旧学校的循环
使用for (... in ...)
Objective-C 2.0中的新语法通常是迭代集合的最快方法,因为它可以在堆栈上维护缓冲区并将批量项目放入其中.
使用NSEnumerator
通常是最慢的方式,因为它经常复制正在迭代的集合; 对于不可变集合,这可能很便宜(相当于-retain
),但对于可变集合,它可能导致创建不可变副本.
进行自己的迭代 - 例如,使用-[NSArray objectAtIndex:]
- 通常会介于两者之间,因为虽然您不会有潜在的复制开销,但您也不会从底层集合中获取批量对象.
(PS - 这个问题应该被标记为Objective-C,而不是C,因为它NSEnumerator
是一个Cocoa类,新的for (... in ...)
语法特定于Objective-C.)
多次运行测试后,结果几乎相同.每个测量块连续运行10次.
我的情况从最快到最慢的结果:
For..in(testPerformanceExample3)(0.006秒)
而(testPerformanceExample4)(0.026秒)
对于(;;)(testPerformanceExample1)(0.027秒)
枚举块(testPerformanceExample2)(0.067秒)
for和while循环几乎相同.
这tmp
是一个NSArray
包含0到999999的100万个对象.
- (NSArray *)createArray { self.tmpArray = [NSMutableArray array]; for (int i = 0; i < 1000000; i++) { [self.tmpArray addObject:@(i)]; } return self.tmpArray; }
整个代码:
ViewController.h
#import@interface ViewController : UIViewController @property (strong, nonatomic) NSMutableArray *tmpArray; - (NSArray *)createArray; @end
ViewController.m
#import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self createArray]; } - (NSArray *)createArray { self.tmpArray = [NSMutableArray array]; for (int i = 0; i < 1000000; i++) { [self.tmpArray addObject:@(i)]; } return self.tmpArray; } @end
MyTestfile.m
#import#import #import "ViewController.h" @interface TestCaseXcodeTests : XCTestCase { ViewController *vc; NSArray *tmp; } @end @implementation TestCaseXcodeTests - (void)setUp { [super setUp]; vc = [[ViewController alloc] init]; tmp = vc.createArray; } - (void)testPerformanceExample1 { [self measureBlock:^{ for (int i = 0; i < [tmp count]; i++) { [tmp objectAtIndex:i]; } }]; } - (void)testPerformanceExample2 { [self measureBlock:^{ [tmp enumerateObjectsUsingBlock:^(NSNumber *obj, NSUInteger idx, BOOL *stop) { obj; }]; }]; } - (void)testPerformanceExample3 { [self measureBlock:^{ for (NSNumber *num in tmp) { num; } }]; } - (void)testPerformanceExample4 { [self measureBlock:^{ int i = 0; while (i < [tmp count]) { [tmp objectAtIndex:i]; i++; } }]; } @end
有关更多信息,请访问:Apples"关于使用Xcode进行测试"