遍历方法功能和效率分析(数组、字典、集合)

一、数组遍历:
1.常用for

NSMutableArray *testArray = [NSMutableArray array];
    for (int i = 0; i < 100000; i++){
        [testArray addObject:@(i)];
    }
    __block int sum = 0;
    double date_for = CFAbsoluteTimeGetCurrent();
    for (int i = 0; i < testArray.count; i++){
        NSNumber *number = testArray[i];
        sum = [number intValue] + sum;
    }
    double date_forEnd = CFAbsoluteTimeGetCurrent();
    double date_forUse = date_forEnd - date_for;
    NSLog(@"sum = %d  forUseTime = %lf",sum,date_forUse);

结论for的计算时间为

2017-11-11 13:29:03.507891+0800 checkAllThing[4443:89434] sum = 704982704  forUseTime = 0.003164

2.使用for in进行遍历计算

sum = 0;
    for (NSNumber *num in testArray){
        int number = [num intValue];
        sum += number;
    }
    double date_forInEnd = CFAbsoluteTimeGetCurrent();
    double date_forInUse = date_forInEnd - date_forEnd;
    NSLog(@"sum = %d    ForInTimeUse = %f",sum,date_forInUse);

for in进行遍历的结果为

2017-11-11 13:29:03.510339+0800 checkAllThing[4443:89434] sum = 704982704    ForInTimeUse = 0.002497

3.使用enumerateObjectsUsingBlock进行计算

sum = 0;
    [testArray enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL * _Nonnull stop) {
        sum += [obj intValue];
    }];
    double dateEnumerateObjectNoOptionEnd = CFAbsoluteTimeGetCurrent();
    double dateEnumerateObjectNoOptionUse = dateEnumerateObjectNoOptionEnd - date_forInEnd;
    NSLog(@"sum = %d   EnumerateObjectNoOption = %f",sum,dateEnumerateObjectNoOptionUse);

计算结果为

2017-11-11 13:29:03.515483+0800 checkAllThing[4443:89434] sum = 704982704   EnumerateObjectNoOption = 0.005145

4.enumerateObjectsWithOptions的计算

sum = 0;
    [testArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSNumber * obj, NSUInteger idx, BOOL * _Nonnull stop) {
        sum += [obj intValue];
    }];
    double dateEnumerateOption = CFAbsoluteTimeGetCurrent();
    double dateEnumerateOptionUse = dateEnumerateOption - dateEnumerateObjectNoOptionEnd;
    NSLog(@"sum = %d   EnumerateObjectNoOptionEnd = %f",sum,dateEnumerateOptionUse);

计算结果为

2017-11-11 13:29:03.520126+0800 checkAllThing[4443:89434] sum = -1728666209   EnumerateObjectNoOptionEnd = 0.004646

5.使用RAC流进行遍历

sum = 0;
    NSArray *arrayData = [[testArray.rac_sequence map:^id(NSNumber * value) {
        sum += [value intValue];
        return value;
    }]array];
    double dateRac_sequence = CFAbsoluteTimeGetCurrent();
    double dateRac_sequenceUse = dateRac_sequence - dateEnumerateOption;
    NSLog(@"sum = %d rac_sequence = %f",sum,dateRac_sequenceUse);

计算结果为:

2017-11-11 13:29:03.708944+0800 checkAllThing[4443:89434] sum = 704982704 rac_sequence = 0.188814

结论分析

2017-11-11 13:29:03.507891+0800 checkAllThing[4443:89434] sum = 704982704  forUseTime = 0.003164
2017-11-11 13:29:03.510339+0800 checkAllThing[4443:89434] sum = 704982704    ForInTimeUse = 0.002497
2017-11-11 13:29:03.515483+0800 checkAllThing[4443:89434] sum = 704982704   EnumerateObjectNoOption = 0.005145
2017-11-11 13:29:03.520126+0800 checkAllThing[4443:89434] sum = -1728666209   EnumerateObjectNoOptionEnd = 0.004646
2017-11-11 13:29:03.708944+0800 checkAllThing[4443:89434] sum = 704982704 rac_sequence = 0.188814

通过结果分析得出以下结论
1.for in 的效率最高,但是在遍历过程中不能实时取得value所对应的index值
2.如果要通过value查询index可以使用enumerateObjectsWithOptions,使用此方法遍历可以使用多线程遍历。但是遍历过程可以无序。效率最高。(用到了dispatch group)
3.如果要通过遍历。通过一定的条件筛选得到一些数据。可以使用rac_sequence方法。直接获得。
4.要想有序的遍历可以使用enumerateObjectsUsingBlock更加清晰直观。但是比for稍微慢一点。

二、字典遍历
1.利用allKeys进行遍历

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    for (int i = 0; i < 10000; i++){
        [dic setObject:@(i) forKey:@(i)];
    }
    
    double allKeyStart = CFAbsoluteTimeGetCurrent();
    for (NSNumber * num in [dic allKeys]){
        NSNumber *num = num;
    }
    double allKeyEnd = CFAbsoluteTimeGetCurrent();
    double allKeyUse = allKeyEnd - allKeyStart;
    NSLog(@"allKeyUseTime = %f",allKeyUse);
运行结果为:2017-11-11 14:02:41.185373+0800 checkAllThing[4939:109563] allKeyUseTime = 0.000173

2.利用allValues

for (NSNumber *numValue in [dic allValues]){
        NSNumber *num = numValue;
    }
    double dateAllValueEnd = CFAbsoluteTimeGetCurrent();
    double dateAllValueUse = dateAllValueEnd - allKeyEnd;
    NSLog(@"dateAllValueEnd = %f",dateAllValueUse);
    
    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSNumber *num = obj;
    }];
    double dateEnumerateNoOptionEnd = CFAbsoluteTimeGetCurrent();
    double dateEnumerationNoOptionUse = dateEnumerateNoOptionEnd - dateAllValueEnd;
    NSLog(@"dateEnumerateNoOptionUse = %f",dateEnumerationNoOptionUse);

运行结果为:

2017-11-11 14:02:41.185776+0800 checkAllThing[4939:109563] dateAllValueEnd = 0.000449

3.使用enumerateKeysAndObjectsWithOptions进行遍历

[dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSNumber *num = obj;
    }];
    double dateEnumerateNoOptionEnd = CFAbsoluteTimeGetCurrent();
    double dateEnumerationNoOptionUse = dateEnumerateNoOptionEnd - dateAllValueEnd;
    NSLog(@"dateEnumerateNoOptionUse = %f",dateEnumerationNoOptionUse);

运行结果为

2017-11-11 14:02:41.186737+0800 checkAllThing[4939:109563] dateEnumerateNoOptionUse = 0.000957

4.使用enumerateKeysAndObjectsWithOptions进行运行

[dic enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSNumber *num = obj;
    }];
    double dateEnumerateOptionEnd = CFAbsoluteTimeGetCurrent();
    double dateEnumerationOptionUse = dateEnumerateOptionEnd - dateEnumerateNoOptionEnd;
    NSLog(@"dateEnumrateOptionUse%f",dateEnumerationOptionUse);

运行结果为

2017-11-11 14:02:41.187683+0800 checkAllThing[4939:109563] dateEnumrateOptionUse0.000947

运行结果进行总结分析如下

2017-11-11 14:02:41.185373+0800 checkAllThing[4939:109563] allKeyUseTime = 0.000173
2017-11-11 14:02:41.185776+0800 checkAllThing[4939:109563] dateAllValueEnd = 0.000449
2017-11-11 14:02:41.186737+0800 checkAllThing[4939:109563] dateEnumerateNoOptionUse = 0.000957
2017-11-11 14:02:41.187683+0800 checkAllThing[4939:109563] dateEnumrateOptionUse0.000947

1.运行分析发现使用allKeys进行遍历效率最高。
2.通过enumrateOption方法可以清晰直观的查看key和value值。
三、集合处理

NSSet *set = [NSSet setWithObjects:@"12",@"32",@"2",@"12", nil];
    [set enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSLog(@"%@",obj);
    }];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容