Hea*_*ser 18 cocoa nsenumerator objective-c
我知道如果你有一个循环来修改循环中项目的计数,在集合上使用NSEnumerator是确保代码爆炸的最佳方法,但是我想了解NSEnumerator类之间的性能权衡而且只是一个旧学校的循环
Chr*_*son 27
使用for (... in ...)Objective-C 2.0中的新语法通常是迭代集合的最快方法,因为它可以在堆栈上维护缓冲区并将批量项目放入其中.
使用NSEnumerator通常是最慢的方式,因为它经常复制正在迭代的集合; 对于不可变集合,这可能很便宜(相当于-retain),但对于可变集合,它可能导致创建不可变副本.
进行自己的迭代 - 例如,使用-[NSArray objectAtIndex:]- 通常会介于两者之间,因为虽然您不会有潜在的复制开销,但您也不会从底层集合中获取批量对象.
(PS - 这个问题应该被标记为Objective-C,而不是C,因为它NSEnumerator是一个Cocoa类,新的for (... in ...)语法特定于Objective-C.)
多次运行测试后,结果几乎相同.每个测量块连续运行10次.
我的情况从最快到最慢的结果:
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;
}
Run Code Online (Sandbox Code Playgroud)
整个代码:
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) NSMutableArray *tmpArray;
- (NSArray *)createArray;
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
MyTestfile.m
#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#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
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请访问:Apples"关于使用Xcode进行测试"
| 归档时间: |
|
| 查看次数: |
6625 次 |
| 最近记录: |