iOS循環(huán)遍歷 性能對(duì)比(for 、forin、NSEnumerator.....)

前段時(shí)間學(xué)習(xí)了NSEnumerator的遍歷方法 感覺很好用 于是總結(jié)一下iOS生涯當(dāng)中 所用到的遍歷。好奇的簡(jiǎn)單了做了一個(gè)效率對(duì)比。沒想到最NB的居然是它。

1、for循環(huán)

for循環(huán)不做過多介紹,入門常用、可以正序、逆序查詢數(shù)據(jù)。也常用于創(chuàng)建九宮格。貼兩行代碼自己體會(huì)。

//for--數(shù)組遍歷
 for (int i = 0; i < self.traverseArray.count; i++) {
        
        NSLog(@"%@",self.traverseArray[i]);
        
    }

//for--字典遍歷
    NSArray *dictionaryArray = [self.traverseDictionary allKeys];
    
    for (int i = 0 ; i < dictionaryArray.count; i++) {
        
        NSLog(@"key = %@",dictionaryArray[i]);
    }

2、forin 循環(huán)

forin 遍歷 又稱快速遍歷 簡(jiǎn)單實(shí)用 比f(wàn)or 循環(huán)等級(jí)高些 與for循環(huán)最明顯的區(qū)別就是看不到循環(huán)次數(shù)及索引情況。數(shù)組是有序的 for循環(huán)過程中也是有序的,forin遍歷過程中是根據(jù)數(shù)組中數(shù)據(jù)添加順序而定的。

    for (NSString *str in self.traverseArray) {
        
        NSLog(@"%@",str);
        
    }

forin 不可逆序遍歷 !

3、枚舉器

枚舉器是一種蘋果官方推薦的更加面向?qū)ο蟮囊环N遍歷方式,相比于for循環(huán),它具有高度解耦、面向?qū)ο?、使用方便等?yōu)勢(shì)
想深入了解的我給大家推薦幾篇文章

//正序遍歷數(shù)組
    [self.traverseArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        NSLog(@"正序%@",obj);

    }];
    
    //逆序遍歷數(shù)組
    [self.traverseArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

         NSLog(@"逆序%@",obj);
    }];
    
    //遍歷字典
#warning 字典是無(wú)序的不存在正序逆序
    [self.traverseDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
        
        NSLog(@"key:%@->value%@",key,value);
        
    }];

4、dispatch_apply函數(shù)

GCD dispatch_apply函數(shù)是一個(gè)同步調(diào)用,block任務(wù)執(zhí)行n次后才返回。該函數(shù)比較適合處理耗時(shí)較長(zhǎng)、迭代次數(shù)較多的情況。

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_apply(self.traverseArray.count, queue, ^(size_t insex) {
      
         NSLog(@"%@",self.traverseArray[insex]);
      
   });

5、ReactiveCocoa 遍歷方法

ReactiveCocoa 中遍歷主要是針對(duì)元組RACTuple,對(duì)于數(shù)組、字典的遍歷都會(huì)包裝成RACTuple進(jìn)行處理。
使用方法先集成ReactiveCocoa 點(diǎn)這里
集成方法有所改變
cocopods引入時(shí) pod ‘ReactiveObjC’
項(xiàng)目引入中 #import "ReactiveObjC/ReactiveObjC.h"

 //數(shù)組遍歷
    [self.traverseArray.rac_sequence.signal subscribeNext:^(id x) {

        NSLog(@"%@",x);
    }];
 //字典遍歷 相當(dāng)于元組數(shù)據(jù)
    [self.traverseDictionary.rac_sequence.signal subscribeNext:^(id x) {
        // 解包元組,會(huì)把元組的值,按順序給參數(shù)里面的變量賦值
        RACTupleUnpack(NSString *key,NSString*value) = x;
        
        NSLog(@"key=%@ value=%@",key,value);
        
    }];

重點(diǎn)來(lái)了

終于說(shuō)到重點(diǎn)了看一下以上幾種遍歷方式 在100、10000、100000次遍歷所耗時(shí)長(zhǎng)。


耗時(shí)時(shí)間表.png

看圖分析、自己領(lǐng)會(huì)。可以根據(jù)自己的需求使用不同的遍歷方式!
然后。。。然后沒有然后了。
Demo:https://github.com/DearWang/TraverseDemo

參考文檔

https://github.com/ReactiveCocoa/ReactiveObjC
http://www.itdecent.cn/p/5d4a8be9baf7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容