1. 程式人生 > >iOS迴圈遍歷 效能對比(for 、forin、NSEnumerator.....)

iOS迴圈遍歷 效能對比(for 、forin、NSEnumerator.....)

前段時間學習了NSEnumerator的遍歷方法 感覺很好用 於是總結一下iOS生涯當中 所用到的遍歷。好奇的簡單了做了一個效率對比。沒想到最NB的居然是它。
1、for迴圈

for迴圈不做過多介紹,入門常用、可以正序、逆序查詢資料。也常用於建立九宮格。貼兩行程式碼自己體會。

//for--陣列遍歷
 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 迴圈
forin 遍歷 又稱快速遍歷  簡單實用 比for 迴圈等級高些 與for迴圈最明顯的區別就是看不到迴圈次數及索引情況。陣列是有序的 for迴圈過程中也是有序的,forin遍歷過程中是根據陣列中資料新增順序而定的。
 for (NSString *str in self.traverseArray) {
        
        NSLog(@"%@",str);
        
    }
forin 不可逆序遍歷 !
3、列舉器
列舉器是一種蘋果官方推薦的更加面向物件的一種遍歷方式,相比於for迴圈,它具有高度解耦、面向物件、使用方便等優勢
想深入瞭解的我給大家推薦幾篇文章
//正序遍歷陣列
    [self.traverseArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {


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


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


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

GCD dispatch_apply函式是一個同步呼叫,block任務執行n次後才返回。該函式比較適合處理耗時較長、迭代次數較多的情況。

  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 中遍歷主要是針對元組RACTuple,對於陣列、字典的遍歷都會包裝成RACTuple進行處理。
使用方法先整合ReactiveCocoa 點這裡
整合方法有所改變
cocopods引入時  pod ‘ReactiveObjC’

專案引入中  #import "ReactiveObjC/ReactiveObjC.h"

//陣列遍歷
    [self.traverseArray.rac_sequence.signal subscribeNext:^(id x) {


        NSLog(@"%@",x);
    }];
//字典遍歷 相當於元組資料
    [self.traverseDictionary.rac_sequence.signal subscribeNext:^(id x) {
        // 解包元組,會把元組的值,按順序給引數裡面的變數賦值
        RACTupleUnpack(NSString *key,NSString*value) = x;
        
        NSLog(@"key=%@ value=%@",key,value);
        
    }];
重點來了
終於說到重點了看一下以上幾種遍歷方式 在100、10000、100000次遍歷所耗時長。



看圖分析、自己領會。可以根據自己的需求使用不同的遍歷方式!
Demo:https://github.com/DearWang/TraverseDemo
參考文件

相關推薦

iOS迴圈 效能對比for forinNSEnumerator.....

前段時間學習了NSEnumerator的遍歷方法 感覺很好用 於是總結一下iOS生涯當中 所用到的遍歷。好奇的簡單了做了一個效率對比。沒想到最NB的居然是它。1、for迴圈for迴圈不做過多介紹,入門常用、可以正序、逆序查詢資料。也常用於建立九宮格。貼兩行程式碼自己體會。//

Android中List迴圈效能對比

在android開發中只要是列表式風格介面我們幾乎都需要用到List來存放資料,在數量很少的List的話幾乎任何一種迴圈遍歷方式整體效能都無差別,但是當我們遇到資料量稍大的時候有必要考慮用哪種方式寫起來比較高效能。 常見的有以下三種: 第一種 for

通過多重迴圈複雜jsonjson裡面巢狀json

var data = {"listDetailDataBean":[{"deptCode":"1111","deptName":"實習部","empAnnualIncome":"1120.00","empJob":"實習0","empName":"員工名0","empNum

java幾種集合速度對比部落格園遷移

  對集合操作進行簡單的進行測試速度,資料量20w,對map,list,set,array,queue進行遍歷測試時間對比。   先貼上一段對這些集合的介紹: 1.1 Set介面   存入Set的每個元素都必須是唯一的,Set介面不保證維護元素的次序

leetcode筆記_連結串列的與刪除虛擬頭結點的使用

203. 移除連結串列元素 刪除連結串列中等於給定值 val 的所有節點。 示例: 輸入: 1->2->6->3->4->5->6, val = 6 輸出: 1->2->3->4->

圖的與輸出 鄰接矩陣和鄰接表

#include <iostream> #include <cstdio> #include "graph.h" using namespace std; int main() { freopen("data.in" , "r" , st

資料庫設計 採用左右值編碼來儲存無限分級樹形結構_2 預排序樹演算法modified preorder tree traversal algorithm

預排序遍歷樹演算法 更新操作:先講述筆者那時候的思路 筆者最初的方法是:偽刪除後偽插入 先更新該節點為根整個樹以外的節點左右值資料(筆者稱之偽刪除) 再更新該節點為根整個樹左右值資料(筆者稱之偽插

Mybatis框架:foreach迴圈欄位(為了解決動態表動態欄位查詢資料)

最近由於需求,需要前端傳遞動態表名,然後根據表名動態查詢欄位,然後對其資料進行處理,匯入空間資料庫。留下腳印,已做標記! 估計這時候會有人想,查詢動態欄位返回值為tableName.*就可以了啊,的確,但是個人原因吧,不太喜歡用*來做為查詢返回欄位,而且用

java基礎學習總結十八:切勿用普通for迴圈LinkedList

ArrayList與LinkedList的普通for迴圈遍歷 對於大部分Java程式設計師朋友們來說,可能平時使用得最多的List就是ArrayList,對於ArrayList的遍歷,一般用如下寫法: public static void main(String[] args) {

2.6 使用for迴圈檔案 2.7 使用while迴圈檔案 2.8 統計系統剩餘的記憶體 2.9 資料型別轉換計算計算mac地址 3.0 資料型別轉換列表與字典相互轉換

2.6 使用for迴圈遍歷檔案 open r:以只讀方式開啟 w: 以寫方式開啟 a: 以追加模式開啟 r+: 以讀寫模式開啟 w+: 以讀寫模式開啟(參見w) a+: 以讀寫模式開啟(參見a) rb: 以二進位制模式開啟 read 我們先寫一個檔案,叫1.txt 內容如下 111 22

JAVA高階基礎10---TreeSet對自定義型別進行定製排序及增強for迴圈集合

TreeSet 自然排序 對於自定義型別,那麼要實現自然排序,需要去 Comparable 介面中的 compareTo 方法。在 compare To 方法中我們可以根據自己的業務要求,來實現自己的排序規則。 定製排序     在建立容器

C++拾趣——STL容器的插入刪除和查詢操作效能對比ubuntu g++——和查詢

遍歷 從前往後 元素個數>15000 traversal_begin_16384_highest         表現最差的是unordered_multiset。其在遍歷到1000個左右的元素時發生較高的延時操作,然後又穩定下來。         除了

HashMap迴圈方式及其效能對比

1. Map的四種遍歷方式 下面只是簡單介紹各種遍歷示例(以HashMap為例),各自優劣會在本文後面進行分析給出結論。 (1) for each map.entrySet() Java 1 2 3 4 5

HashMap 4種迴圈方式及其效能對比

主要介紹HashMap的四種迴圈遍歷方式,各種方式的效能測試對比,根據HashMap的原始碼實現分析效能結果,總結結論。 1. Map的四種遍歷方式 下面只是簡單介紹各種遍歷示例(以HashMap為例),各自優劣會在本文後面進行分析給出結論。 (1) for each

ArrayList和LinkedList的幾種迴圈方式及效能對比分析 主要介紹ArrayList和LinkedList這兩種list的五種迴圈方式,各種方式的效能測試對比,根據ArrayLis

主要介紹ArrayList和LinkedList這兩種list的五種迴圈遍歷方式,各種方式的效能測試對比,根據ArrayList和LinkedList的原始碼實現分析效能結果,總結結論。 通過本文你可以瞭解(1)List的五種遍歷方式及各自效能 (2)foreach及Iterator的實現 (3)加

使用for迴圈字串時迴圈變數型別的坑

通常情況下,使用for迴圈可以通過遞增,也可以通過遞減,使用遞減遍歷程式碼如下: - (void)testFor { NSString *string = @"信不信由你"; for (int i = string.length - 1; i >= 0;

Python中的用for,while迴圈檔案例項

使用for迴圈遍歷檔案 開啟檔案 open r:以讀模式開啟 w:以寫模式開啟 a:以追加模式開啟 r+:以讀寫模式開啟 w+:以讀寫模式開啟(參見w) a+:以讀寫模式開啟(參見a) rb:以二進位制讀模式開啟 wb:以二進位制寫模式開啟(參見w) ab:以二進位制追

shell中的for迴圈目錄

1 目錄結構說明 a. 檔名 convert_video_to_images.sh b. /User/document/list目錄下有A1目錄 c. A1目錄下有檔案v_Skiing_g01_c01.avi、v_Skiing_g01_c02.avi、v_Skijet

小程式-for迴圈的使用

.js檔案: Page({ /** * 頁面的初始資料 */ data: { datas:[ { title: '提交申請', txt: '選擇服務型別,填寫基本資訊,提交' }, { title: '材料稽核', txt: '收到電網企業電話,與

for迴圈linux當前目錄的結構

for i in `ls`;do echo ">>>"$i ;ls $i;done [[email protected] cache]# for i in `ls`;do echo ">>>"$i ;ls $i