iOS開發Tips3:迴圈的效能
遍歷列表應該是平時開發中最常見的一種操作了。說起遍歷效率,相比於其他方面的因素(可維護性,易懂等),也許遍歷的效率在你的程式碼中並不是那麼重要。
但我們還是要了解一下從效能方面去考慮遍歷這個問題,以便在一寫特殊的case下知道怎麼著手去優化。
下面是幾種常用的遍歷方式:
1. for (NSInteger i = 0 ; i < len; i++)
2. for (NSObject *obj in Array)3. - (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL
DISPATCH_NOESCAPEvoid (^block)(size_t));
5.NSEnumerator
1. 我們最常用的遍歷方式
2. 快速遍歷,這種寫法在 寫法上更直接明瞭,可以直接拿到陣列中的元素
3. 蘋果提供的block塊遍歷, 有以下特點:
1. 索引和元素均可以返回,其他只返回元素
2. 併發列舉,也不是說併發就一定高效,當有大量的任務去做的時候,在多核處理器下,對效能的提升比較明顯,相反,要是任務很小,它帶來的好處可能並不大,在效能比較重要的場景可以試驗權衡。
4. Index 順序不確定,因為它是並行執行的(dispatch_get_global_queue是並行佇列)。這裡 dispatch_apply如果換成序列佇列上,則會依次輸出index。
dispathc_apply 是dispatch_sync 和dispatch_group的關聯API.它以指定的次數將指定的Block加入到指定的佇列中。並等待佇列中操作全部完成。
5. 每次被呼叫時會生成NSEnumerator例項,並指向第一個元素,和連結串列next指標一樣,nextObject方法返回下一個元素,直到元素為nil止。
下面看程式碼,我們目標是獲取到每個元素:
列印結果:- (void)loop_test { NSArray *sampleItemArray = [self itemArray]; CFTimeInterval startTime = CFAbsoluteTimeGetCurrent(); // - - - - - - - - - - - --- - - -- - -- -- - - - -- - -- - NSInteger len = [sampleItemArray count]; for (NSInteger i = 0 ; i < len; i++){ NSObject *obj = sampleItemArray[i]; } NSLog(@"common for-in loop: %.8f", CFAbsoluteTimeGetCurrent() - startTime); // - - - - - - - - - - - --- - - -- - -- -- - - - -- - -- - startTime = CFAbsoluteTimeGetCurrent(); for (NSObject *obj in sampleItemArray){ } NSLog(@"fast for-in loop: %.8f", CFAbsoluteTimeGetCurrent() - startTime); // - - - - - - - - - - - --- - - -- - -- -- - - - -- - -- - startTime = CFAbsoluteTimeGetCurrent(); [sampleItemArray enumerateObjectsUsingBlock:^(NSObject * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { }]; NSLog(@"enumerate-block loop: %.8f", CFAbsoluteTimeGetCurrent() - startTime); // - - - - - - - - - - - --- - - -- - -- -- - - - -- - -- - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); startTime = CFAbsoluteTimeGetCurrent(); dispatch_apply([sampleItemArray count], queue, ^(size_t index) { NSObject *obj = sampleItemArray[index]; }); NSLog(@"dispatch_apply loop: %.8f", CFAbsoluteTimeGetCurrent() - startTime); // - - - - - - - - - - - --- - - -- - -- -- - - - -- - -- - NSObject *obj = nil; startTime = CFAbsoluteTimeGetCurrent(); NSEnumerator *enumerator = [sampleItemArray objectEnumerator]; while ((obj = [enumerator nextObject])) { } NSLog(@"NSEnumerator loop: %.8f", CFAbsoluteTimeGetCurrent() - startTime); }
common for loop: 0.00076401
fast for-in loop: 0.00004494
enumerate-block loop: 0.00093901
dispatch_apply loop: 0.00052500
NSEnumerator loop: 0.00072098
結論分析:資料來看1. 效能最優 的是快速列舉for-in2. enumerate-block效能最差,是快速列舉的近20倍。
3. NSEnumerator和普通的for迴圈差別不大,是apply的1.4倍
相關推薦
iOS開發Tips3:迴圈的效能
遍歷列表應該是平時開發中最常見的一種操作了。說起遍歷效率,相比於其他方面的因素(可維護性,易懂等),也許遍歷的效率在你的程式碼中並不是那麼重要。但我們還是要了解一下從效能方面去考慮遍歷這個問題,以便在一寫特殊的case下知道怎麼著手去優化。下面是幾種常用的遍歷方式:1. fo
iOS開發Tips3
SEL輸出函式nil,Nil,Null,NSNull,null區別檢測系統版iOS中使用blend改變圖片顏色 -------------------------------------------
IOS開發-提升app效能的25條建議和技巧
前言 這篇文章介紹了作者開發工作中總結的25個iOS開發tips, 多年之前讀過這篇文章,收益良多,基本每一個tips在我的應用開發過程中都使用過。今天把這篇文章重新整理轉發下,與大家一起學習,不論你處於什麼開發階段,這些tips都值得你反覆熟悉。
iOS開發 ----- 自動迴圈滾動或引導頁效果
AutoScroller 一個簡單的滾動檢視,可以實現三種功能,比較簡單,就不解釋了,Demo連結 1 在LoopScroller.h中,可以實現迴圈自動滾動,或滑動迴圈滾動 1.1用法 LoopScroller * loop =
iOS開發基礎Swift(04)— 迴圈
迴圈的介紹在開發中經常會需要迴圈常見的迴圈有:for/while/do while.這裡我們只介紹for/while,因為for/while最常見for迴圈的寫法最常規寫法// 傳統寫法 for var
iOS開發-Block使用及迴圈引用的解決
Block是一種比較特殊的資料型別。它可以儲存一段程式碼,在合適的時候取出來呼叫。 ◦ 我們可以把Block當做Objective-C的匿名函式。Block允許開發者在兩個物件之間將任意的語句當做資料進行傳遞,往往這要比引用定義在別處的函式直觀。另外,block的實現具
ios開發之使用block引發迴圈引用導致記憶體洩露
// // JLPerson.h // BlockTest // // Created by Mac on 15-3-28. // Copyright (c) 2015年 vxinyou. All rights reserved. // #import typedef void (^MyBloc
iOS開發之效能除錯Instruments(二)
如何定位記憶體問題 今天主要講最常見的定位記憶體問題,普遍使用ARC後,開發者們從手動管理引用計數中解放出來,但開啟了ARC並不是就不會存在記憶體問題。 蘋果有句名言:ARC is only for NSObject。在iOS 中使用malloc分配的記憶體,ARC是不會
iOS開發之效能除錯Instruments(一)
iOS效能除錯有很多方法,這裡講一下Xcode內建工具Instruments。 Instruments是一個官方提供的強大的效能除錯工具集。 instruments.png 1.Blank(空模板):建立一個空的模板,可以從Library庫中新增其他模板; 2.Act
精通iOS開發--第15章 Grand Central Dispatch和後臺處理之Block與Self的迴圈引用
Block與Self的迴圈引用 01:眾所周知若self中引用了Block塊,而此Block塊中又引用了Self則會造成迴圈引用,需要提醒的是即使在你的block程式碼中沒有顯式地出現"s
iOS開發——Block引起迴圈引用的解決方案
記憶體問題始終是軟體開發中的頭等大事,iOS開發中也不例外,在面試中也是必問的問題。今天我們主要來講講Block中涉及的迴圈引用問題。當我們自己一開始寫程式碼的時候,可能會大量在block中使用self,但是當看到別人優秀的程式碼的時候,發現別人常常不是用sel
iOS開發-------滾動檢視(UIScrollView)並實現迴圈滾動
滾動檢視(UIScrollView) 其實是一個能夠實現存放大圖片以及實現滾動的元件,比如有的圖片很大,但是用UIImageView裝不下,那麼這個時候就需要UIScrollView了,如果說舉例子的話,很多地方都用到了,比如頁面滾動的廣告檢視,滾動的頭條等,
iOS開發記憶體優化之自動檢測記憶體洩露,檢查是否有迴圈引用,檢查記憶體為何如此大,Block迴圈引用的檢查
手機裝置的記憶體是一個共享資源。應用程式可能會不當的耗盡記憶體、崩潰,或者遭遇大幅度的效能降低。 Facebook iOS客戶端有很多功能,並且它們共享同一塊記憶體空間。如果任何特定的功能消耗過多的記憶體,就會影響到整個應用程式。這是可能發生的,比如,這個功能導致了記
iOS開發系列--無限迴圈的圖片瀏覽器
--UIKit之UIScrollView 概述 UIKit框架中有大量的控制元件供開發者使用,在iOS開發中不僅可以直接使用這些控制元件還可以在這些控制元件的基礎上進行擴充套件打造自己的控制元件。在這個系列中如果每個控制元件都介紹一遍確實沒有必要,所謂授人以魚不如授人以漁,這裡會儘可能讓大家明白其中的原理
iOS開發 底層拋析執行迴圈—— RunLoop
一.RunLoop基本概念 概念:程式的執行迴圈,通俗的來說就是跑圈. 1. 基本作用(作用重大) (1) 保持程式的持續執行(ios程式為什麼能一直活著不會死) (2) 處理app中的各種事件(比如觸控事件、定時器事件【NSTimer】、sel
iOS開發筆記6:圖片輪播及其無限迴圈效果
m 平時APP中的廣告位或者滾動的新聞圖片等用到的就是圖片輪播這種效果,實現方式主要有兩種,一種是ScrollView+ImageView,另一種則是通過CollectionView,今天總結的是ScrollView這種方式。 1.圖片輪播效果實現 主
【iOS開發-79】利用Modal方式實現控制器之間的跳轉
article 運用 mis cli 控制 present 沒有 dismiss 導航控制器 利用Modal方法。事實上就是以下兩個方法的運用。Modal方式的切換效果是從底部呈現。 -(void)clickModal{ WPViewController *wp
ios開發之 -- invalid nib registered for identifier
層級關系 註意 刪除 出現 ide 提示 sta tab 後來 今天在寫代碼的時候,碰到這麼一個問題: invalid nib registered for identifier (重用符) - nib must contain exactly one top level
IOS開發UI篇--一個支持圖文混排的ActionSheet
log one 簡單介紹 button action 曾經 hot uitable ios 一、簡單介紹 UIActionSheet是IOS提供給我們開發人員的底部彈出菜單控件。一般用於菜單選擇、操作確認、刪除確認等功能。IOS官方提供的下面方式對UI
iOS開發項目實戰——Swift實現圖片輪播與瀏覽
0.10 上網 timer類 開發項目 cas hub string obj tle 近期開始開發一個新的iOS應用,自己決定使用Swift。進行了幾天之後,發現了一個非常嚴峻的問題。那就是無論是書籍,還是網絡資源,關於Swift的實在是太少了,隨便一