在性能優化中一個最具參考價值的屬性是FPS:Frames Per Second,其實就是屏幕刷新率,蘋果的iphone推薦的刷新率是60Hz,也就是說GPU每秒鐘刷新屏幕60次,這每刷新一次就是一幀frame,FPS也就是每秒鐘刷新多少幀畫面。靜止不變的頁面FPS值是0,這個值是沒有參考意義的,只有當頁面在執行動畫或者滑動的時候,FPS值才具備參考價值,FPS值的大小體現了頁面的流暢程度高低,當低於45的時候卡頓會比較明顯。javascript
圖層混合:java
每個layer是一個紋理,全部的紋理都以某種方式堆疊在彼此的頂部。對於屏幕上的每個像素,GPU須要算出怎麼混合這些紋理來獲得像素RGB的值。web
當Sa = 0.5時,RGB值爲(0.5, 0, 0),能夠看出,當兩個不是徹底不透明的CALayer覆蓋在一塊兒時,GPU大量作這種複合操做,隨着這中操做的越多,GPU越忙碌,性能確定會受到影響。面試
公式:數據庫
R = S + D * ( 1 – Sa )編程
結果的顏色是源色彩(頂端紋理)+目標顏色(低一層的紋理)*(1-源顏色的透明度)。json
當Sa = 1時,R = S,GPU將不會作任何合成,而是簡單從這個層拷貝,不須要考慮它下方的任何東西(由於都被它遮擋住了),這節省了GPU至關大的工做量。緩存
一、用ARC管理內存
二、在正確的地方使用 reuseIdentifier
三、儘可能把views設置爲透明
四、避免過於龐大的XIB
五、不要阻塞主線程性能優化
六、在ImageViews中調整圖片大小。若是要在UIImageView中顯示一個來自bundle的圖片,你應保證圖片的大小和UIImageView的大小相同。在運行中縮放圖片是很耗費資源的,特別是UIImageView嵌套在UIScrollView中的狀況下。若是圖片是從遠端服務加載的你不能控制圖片大小,好比在下載前調整到合適大小的話,你能夠在下載完成後,最好是用background
thread,縮放一次,而後在UIImageView中使用縮放後的圖片。服務器
七、選擇正確的Collection。
八、打開gzip壓縮。app可能大量依賴於服務器資源,問題是咱們的目標是移動設備,所以你就不能期望網絡情況有多好。減少文檔的一個方式就是在服務端和你的app中打開gzip。這對於文字這種能有更高壓縮率的數據來講會有更顯著的效用。
iOS已經在NSURLConnection中默認支持了gzip壓縮,固然AFNetworking這些基於它的框架亦然。
一、重用和延遲加載(lazy load) Views
二、Cache, Cache, 仍是Cache!
三、權衡渲染方法.性能能仍是要bundle保持合適的大小。
四、處理內存警告.移除對緩存,圖片object和其餘一些能夠重建立的objects的strong references.
五、重用大開銷對象
六、一些objects的初始化很慢,好比NSDateFormatter和NSCalendar。然而,你又不可避免地須要使用它們,好比從JSON或者XML中解析數據。想要避免使用這個對象的瓶頸你就須要重用他們,能夠經過添加屬性到你的class裏或者建立靜態變量來實現。
七、避免反覆處理數據.在服務器端和客戶端使用相同的數據結構很重要。
八、選擇正確的數據格式.解析JSON會比XML更快一些,JSON也一般更小更便於傳輸。從iOS5起有了官方內建的JSON deserialization 就更加方便使用了。可是XML也有XML的好處,好比使用SAX 來解析XML就像解析本地文件同樣,你不需像解析json同樣等到整個文檔下載完成纔開始解析。當你處理很大的數據的時候就會極大地減低內存消耗和增長性能。
九、正確設定背景圖片
十、減小使用Web特性。想要更高的性能你就要調整下你的HTML了。第一件要作的事就是儘量移除沒必要要的javascript,避免使用過大的框架。能只用原生js就更好了。儘量異步加載例如用戶行爲統計script這種不影響頁面表達的javascript。注意你使用的圖片,保證圖片的符合你使用的大小。
十一、Shadow Path 。CoreAnimation不得不先在後臺得出你的圖形並加好陰影而後才渲染,這開銷是很大的。使用shadowPath的話就避免了這個問題。使用shadow path的話iOS就沒必要每次都計算如何渲染,它使用一個預先計算好的路徑。但問題是本身計算path的話可能在某些View中比較困難,且每當view的frame變化的時候你都須要去update shadow path.
十二、優化Table View
1三、選擇正確的數據存儲選項
一、加速啓動時間。快速打開app是很重要的,特別是用戶第一次打開它時,對app來說,第一印象太太過重要了。你能作的就是使它儘量作更多的異步任務,好比加載遠端或者數據庫數據,解析數據。避免過於龐大的XIB,由於他們是在主線程上加載的。因此儘可能使用沒有這個問題的Storyboards吧!必定要把設備從Xcode斷開來測試啓動速度
二、使用Autorelease Pool。NSAutoreleasePool`負責釋放block中的autoreleased objects。通常狀況下它會自動被UIKit調用。可是有些情況下你也須要手動去建立它。假如你建立不少臨時對象,你會發現內存一直在減小直到這些對象被release的時候。這是由於只有當UIKit用光了autorelease pool的時候memory纔會被釋放。消息是你能夠在你本身的@autoreleasepool裏建立臨時的對象來避免這個行爲。
三、選擇是否緩存圖片。常見的從bundle中加載圖片的方式有兩種,一個是用imageNamed,二是用imageWithContentsOfFile,第一種比較常見一點。
四、避免日期格式轉換。若是你要用NSDateFormatter來處理不少日期格式,應該當心以待。就像先前提到的,任什麼時候候重用NSDateFormatters都是一個好的實踐。若是你能夠控制你所處理的日期格式,儘可能選擇Unix時間戳。你能夠方便地從時間戳轉換到NSDate:
- (NSDate*)dateFromUnixTimestamp:(NSTimeInterval)timestamp { return[NSDate dateWithTimeIntervalSince1970:timestamp]; }
這樣會比用C來解析日期字符串還快!須要注意的是,許多web API會以微秒的形式返回時間戳,由於這種格式在javascript中更方便使用。記住用dateFromUnixTimestamp以前除以1000就行了。
平時你是如何對代碼進行性能優化的?
優化Table View
UIImage加載圖片性能問題
使用場景須要編程時,應該根據實際應用場景加以區分,UIimage雖小,但使用元素較多問題會有所凸顯.
講講你用Instrument優化動畫性能的經歷吧(別問我什麼是Instrument)
Apple的instrument爲開發者提供了各類template去優化app性能和定位問題。不少公司都在趕feature,並無充足的時間來作優化,致使很多開發者對instrument不怎麼熟悉。但這裏面其實涵蓋了很是完整的計算機基礎理論知識體系,memory,disk,network,thread,cpu,gpu等等,順藤摸瓜去學習,是一筆巨大的知識財富。動畫性能只是其中一個template,重點仍是理解上面問題當中CPU GPU如何配合工做的知識。
facebook啓動時間優化
1.瘦身請求依賴
2.UDP啓動請求先行緩存
3.隊列串行化處理啓動響應
另外附上一份各個好友收集的各大廠面試題+答案 ! 須要的可加 iOS技術探討羣:624212887,羣文件直接獲取
以下圖所示: