instrument 分析:
參考文檔:
1.http://www.reibang.com/p/9e1f0b44935c
2.http://www.open-open.com/lib/view/open1421115558515.html
使用文檔:
http://cdn.cocimg.com/bbs/attachment/Fid_6/6_24457_90eabb4ed5b3863.pdf
關(guān)于性能優(yōu)化的25個(gè)建議和技巧:
http://blog.jobbole.com/37984/
性能優(yōu)化:
啟動(dòng)時(shí)間、用戶(hù)響應(yīng)(UI反饋?lái)憫?yīng)及時(shí))耘分、列表滾動(dòng)操作流暢蚊丐、圖形動(dòng)畫(huà)、內(nèi)存使用合理、不會(huì)隨便crash。
1.NSDateFormatter?
創(chuàng)建耗時(shí)33ms ,NSDateFormatter 設(shè)置3個(gè)屬性平均耗時(shí)也在30ms左右汞贸,NSCalendar與之類(lèi)似。
解決方案:盡量避免采用處理多個(gè)日期格式,當(dāng)然針對(duì)日期格式處理如果需要提高更多的速度著蛙,可以直接采用C,可以菜用https://blog.soff.es/how-to-drastically-improve-your-app-with-an-afternoon-and-instruments來(lái)規(guī)避這個(gè)問(wèn)題耳贬。
2.UIImage緩存取舍
imagedNamed 初始化:默認(rèn)加載圖片成功后會(huì)在內(nèi)存中緩存圖片踏堡,這個(gè)方法用一個(gè)指定的名字在系統(tǒng)緩存中查找并返回一個(gè)圖片對(duì)象。如果緩存中沒(méi)有找到形影的圖片對(duì)象咒劲,則從指定地方加載圖片然后緩存對(duì)象顷蟆,并返回這個(gè)圖片對(duì)象。
imagedWithContentsOfFile初始化:僅加載圖片腐魂,不緩存帐偎。
解決方案:
大量使用imageNamed方式會(huì)在不需要緩存的地方額外增加開(kāi)銷(xiāo)CPU的時(shí)間來(lái)哦做這件事,當(dāng)應(yīng)用程序需要加載一張比較大的圖片并且使用一次性蛔屹,那么其實(shí)是沒(méi)有必要去緩存這個(gè)圖片的削樊,用imageWithContentsOfFile是最為經(jīng)濟(jì)的方式,這樣不會(huì)因?yàn)閁IImage元素較多情況下兔毒,CPU會(huì)被逐個(gè)分散在不必要緩存上浪費(fèi)過(guò)多時(shí)間漫贞。
3.對(duì)于不一定展示的而且費(fèi)時(shí)UI盡量采用多線(xiàn)程,將必須展示的UI放在主線(xiàn)程中育叁,而不一定展示的UI放在子線(xiàn)程中
另外針對(duì)單個(gè)view 盡量不要在viewWillAppear費(fèi)時(shí)的操作迅脐,viewWillAppear在 view 顯示之前被調(diào)用,出于效率考慮豪嗽,在這個(gè)方法中不要處理復(fù)雜費(fèi)時(shí)的事情谴蔑;只應(yīng)該在這個(gè)方法設(shè)置 view 的顯示屬性之類(lèi)的簡(jiǎn)單事情黔攒,比如背景色甜熔,字體等话肖。不然宙地,用戶(hù)會(huì)明顯感覺(jué)到 view 顯示遲鈍崖疤。
4.避免首次加載耗時(shí)
應(yīng)用程序首次加載中啟動(dòng)方法willFinishLaunchingWithOptions和didFinishLaunchingWithOptions只做應(yīng)用程序首次啟動(dòng)必須的要操作,而針對(duì)_dyid_start在初始化庫(kù)framework函數(shù)的操作.不必要的Framework不要鏈接序臂,避免首次加載耗時(shí)桐智。
5.盡量把views設(shè)置為不透明
如果你有不透明的Views意荤,你應(yīng)該設(shè)置它們的opaque屬性為YES蹦玫。原因是這會(huì)使系統(tǒng)用一個(gè)最優(yōu)的方式渲染這些views赎婚。
(opaque)這個(gè)屬性給渲染系統(tǒng)提供了一個(gè)如何處理這個(gè)view的提示。如果設(shè)為YES樱溉, 渲染系統(tǒng)就認(rèn)為這個(gè)view是完全不透明的挣输,這使得渲染系統(tǒng)優(yōu)化一些渲染過(guò)程和提高性能。如果設(shè)置為NO福贞,渲染系統(tǒng)正常地和其它內(nèi)容組成這個(gè)View撩嚼。
在模擬器中用Debug\Color Blended Layers選項(xiàng)來(lái)發(fā)現(xiàn)哪些view沒(méi)有被設(shè)置為opaque。目標(biāo)就是,能設(shè)為opaque的就全設(shè)為opaque!
6.避免過(guò)于龐大的XIB
iOS5中加入的Storyboards(分鏡)正在快速取代XIB完丽。然而XIB在一些場(chǎng)景中仍然很有用恋技。比如你的app需要適應(yīng)iOS5之前的設(shè)備,或者你有一個(gè)自定義的可重用的view,你就不可避免地要用到他們逻族。
如果你不得不XIB的話(huà)蜻底,使他們盡量簡(jiǎn)單。嘗試為每個(gè)Controller配置一個(gè)單獨(dú)的XIB聘鳞,盡可能把一個(gè)View Controller的view層次結(jié)構(gòu)分散到單獨(dú)的XIB中去薄辅。
需要注意的是,當(dāng)你加載一個(gè)XIB的時(shí)候所有內(nèi)容都被放在了內(nèi)存里抠璃,包括任何圖片站楚。如果有一個(gè)不會(huì)即刻用到的view,你這就是在浪費(fèi)寶貴的內(nèi)存資源了搏嗡。Storyboards就是另一碼事兒了窿春,storyboard僅在需要時(shí)實(shí)例化一個(gè)view controller。
7.不要阻塞主線(xiàn)程
永遠(yuǎn)不要使主線(xiàn)程承擔(dān)過(guò)多采盒。因?yàn)閁IKit在主線(xiàn)程上做所有工作谁尸,渲染,管理觸摸反應(yīng)纽甘,回應(yīng)輸入等都需要在它上面完成良蛮。一直使用主線(xiàn)程的風(fēng)險(xiǎn)就是如果你的代碼真的block了主線(xiàn)程,你的app會(huì)失去反應(yīng)悍赢。
大部分阻礙主進(jìn)程的情形是你的app在做一些牽涉到讀寫(xiě)外部資源的I/O操作决瞳,比如存儲(chǔ)或者網(wǎng)絡(luò)。
你可以使用NSURLConnection異步地做網(wǎng)絡(luò)操作:
+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler或者使用像AFNetworking這樣的框架來(lái)異步地做這些操作左权。
如果你需要做其它類(lèi)型的需要耗費(fèi)巨大資源的操作(比如時(shí)間敏感的計(jì)算或者存儲(chǔ)讀寫(xiě))那就用 Grand Central Dispatch皮胡,或者 NSOperation 和 NSOperationQueues。
8.在Image Views中調(diào)整圖片大小
如果要在UIImageView中顯示一個(gè)來(lái)自bundle的圖片赏迟,你應(yīng)保證圖片的大小和UIImageView的大小相同屡贺。在運(yùn)行中縮放圖片是很耗費(fèi)資源的,特別是UIImageView嵌套在UIScrollView中的情況下锌杀。
如果圖片是從遠(yuǎn)端服務(wù)加載的你不能控制圖片大小甩栈,比如在下載前調(diào)整到合適大小的話(huà),你可以在下載完成后糕再,最好是用background thread量没,縮放一次,然后在UIImageView中使用縮放后的圖片突想。
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg:
在后臺(tái)執(zhí)行一個(gè)操作殴蹄,本質(zhì)就是重新創(chuàng)建一個(gè)線(xiàn)程執(zhí)行當(dāng)前方法究抓。
9.選擇正確的Collection!袭灯?
學(xué)會(huì)選擇對(duì)業(yè)務(wù)場(chǎng)景最合適的類(lèi)活著對(duì)象是寫(xiě)出能效高的代碼的基礎(chǔ)刺下。
一些常見(jiàn)Collection的總結(jié):
Arrays: 有序的一組值。使用index來(lái)lookup很快稽荧,使用value lookup很慢怠李, 插入/刪除很慢。
Dictionaries: 存儲(chǔ)鍵值對(duì)蛤克。 用鍵來(lái)查找比較快。
Sets: 無(wú)序的一組值夷蚊。用值來(lái)查找很快构挤,插入/刪除很快。
10.打開(kāi)gzip壓縮惕鼓?筋现?
iOS已經(jīng)在NSURLConnection中默認(rèn)支持了gzip壓縮,當(dāng)然AFNetworking這些基于它的框架亦然箱歧。像Google App Engine這些云服務(wù)提供者也已經(jīng)支持了壓縮輸出矾飞。
11.優(yōu)化TableView
為了保證table view平滑滾動(dòng),確保你采取了以下的措施:
正確使用reuseIdentifier來(lái)重用cells
盡量使所有的view opaque呀邢,包括cell自身
避免漸變洒沦,圖片縮放,后臺(tái)選入
緩存行高
如果cell內(nèi)顯示的內(nèi)容來(lái)自web价淌,使用異步加載申眼,緩存請(qǐng)求結(jié)果
使用shadowPath來(lái)畫(huà)陰影
減少subviews的數(shù)量
盡量不使用cellForRowAtIndexPath:,如果你需要用到它蝉衣,只用一次然后緩存結(jié)果
使用正確的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù)
使用rowHeight,sectionFooterHeight和sectionHeaderHeight來(lái)設(shè)定固定的高括尸,不要請(qǐng)求delegate