当前位置:  开发笔记 > IOS > 正文

NSEnumerator性能vs Cocoa中的循环

如何解决《NSEnumerator性能vsCocoa中的循环》经验,为你挑选了2个好方法。

我知道如果你有一个循环来修改循环中项目的计数,在集合上使用NSEnumerator是确保代码爆炸的最佳方法,但是我想了解NSEnumerator类之间的性能权衡而且只是一个旧学校的循环



1> Chris Hanson..:

使用for (... in ...)Objective-C 2.0中的新语法通常是迭代集合的最快方法,因为它可以在堆栈上维护缓冲区并将批量项目放入其中.

使用NSEnumerator通常是最慢的方式,因为它经常复制正在迭代的集合; 对于不可变集合,这可能很便宜(相当于-retain),但对于可变集合,它可能导致创建不可变副本.

进行自己的迭代 - 例如,使用-[NSArray objectAtIndex:]- 通常会介于两者之间,因为虽然您不会有潜在的复制开销,但您也不会从底层集合中获取批量对象.

(PS - 这个问题应该被标记为Objective-C,而不是C,因为它NSEnumerator是一个Cocoa类,新的for (... in ...)语法特定于Objective-C.)



2> Zsivics Sane..:

多次运行测试后,结果几乎相同.每个测量块连续运行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进行测试"

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有