程式設計師面試閃充 -- 效能優化
CPU 和GPU
關於繪圖和動畫有兩種處理方式CPU(中央處理器)和GPU(圖形處理器),CPU的工作都在軟體層面,而GPU的在硬體層面。
總的來說,可以使用CPU做任何事情,但是對於影像的處理,通常GPU會更快,因為GPU使用影像對高度並行的浮點運算做了優化,所以,我們想盡可能的把螢幕渲染的工作交給硬體去處理,而問題在於GPU並沒有無限制處理的效能,一旦資源用盡,即使CPU並沒有完全佔用,GPU效能還是會下降。
所以,目前大多的效能優化都是關於智慧利用GPU和CPU,平衡它們之間工作負載。
Xcode自帶除錯工具
Instruments
Instruments是Xcode套件中沒有被充分利用的工具,很多iOS開發者從來沒用過Instrument,很多面試官也會問效能條調優方面的知識,來判斷大家到底擁有幾年開發經驗。
開啟instruments有兩種方式。一是通過open Developer tool開啟,二是使用product選項的profile。
-
core animation
Core Animation工具是用來檢測Core Animation效能的,用來檢視介面是否卡頓。在這裡可以檢視到重新整理幀率和離屏渲染的效果。手機螢幕所顯示的內容都是一個個點組成的。組成的螢幕上完整的一張圖片稱為一幀。幀率是指一秒鐘的時間內重新繪製螢幕多少次。人眼的頻率是24,為了保證螢幕的流暢度,重新整理幀率應該在50+。在兩幀重新整理運算沒有做完,讓使用者產生卡頓的感覺如果要提高效能,最關鍵的是要減少計算量。計算量減少了就能保證每一幀都完成計算,從而達到流暢的效果。
第一個除錯選項"Color Blended Layers"正是用於檢測哪裡發生了圖層混合,並用紅色標記出來。因此我們需要儘可能減少看到的紅色區域。一旦發現應該想法設法消除它。開始除錯後勾選這個選項,
第二個除錯選項是“Color Hits Green and Misses Red”,它表示如果命中快取則顯示為綠色,否則顯示為紅色,顯然綠色越多越好,紅色越少越好。
第三、四個選項的使用場景不多,我們直接看一下第五個選項“Color Misaligned Images”。它表示如果圖片需要縮放則標記為黃色,如果沒有畫素對齊則標記為紫色。
第六個選項“Color Offscreen-Rendered Yellow”會把需要離屏渲染的地方標記為黃色,大部分情況下我們需要儘可能避免黃色的出現。離屏渲染可能會自動觸發,也可以手動觸發。
- leaks
用來檢視app執行期間,那些程式碼產生記憶體洩露。
記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間。作為使用者,根本感覺不到記憶體洩漏的存在。但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被佔光。
點選小紅點執行,如果在3區域有紅X出現, 則有記憶體洩露, 4區域則會顯示洩露的物件。打用leaks進行監測:點選洩露物件可以在(下圖)看到它們的記憶體地址, 佔用位元組, 所屬框架和響應方法等資訊.開啟擴充套件檢視, 可以看到右邊的跟蹤堆疊資訊,4 黑色程式碼最有可能出現記憶體洩漏的方法
- Time Profiler
在開發的過程中,我們經常能感覺到,點選某一按鈕,或者做了某一操作,會出現卡頓的現象,被稱為延遲。使用Time profile工具,就可以揪出耗時的函式。
選擇需要除錯的專案,勾選安裝執行緒分割和隱藏系統的函式。就可以在下方檢視相關的耗時操作,右鍵定位到耗時的方法,開啟程式碼就能很快解決問題。
Activity Monitor
類似於工作管理員,可以檢視所有的程式,以及程式的記憶體、cpu使用百分比等資料等
Allocations
管理記憶體是app開發中最重要的一個方面,對於開發者來說,在程式架構中減少記憶體的使用通常都是使用Allocations去定位和找出減少記憶體使用的方式。
面試題
問題一:
在開發中,如何去優化tableview呢?
答:
行高一定要快取: 行高方法其實被呼叫的次數非常多。通過快取行高,可以減少大量計算自動佈局的過程。
不要動態建立子檢視:當cell顯示的時候,不要再去建立了。所有的自檢視都應該預先建立,如果不需要顯示可以設定hidden。
所有的子檢視都必須制定背景顏色
所有的顏色都不要使用alpha:設定alpha會增加圖層的計算,對效能的消耗非常之大。
cell柵格化
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if(self){
//柵格化
self.layer.shouldRasterize = YES;
// 柵格化必須指定解析度,否則預設使用 *1 生成影像
self.layer.raterizationScale = [UIScreen mainScreen].scale;
}
return self;
}
- 非同步繪製
self.layer.drawsAsynchronously = YES;
問題二:
SDWebimage 在記憶體方面存在很大的問題,如何解決動態圖片記憶體不釋放的問題?
答:SDWebimage 在記憶體方面存在很大的記憶體問題,靜態的圖片也會出現拉伸問題,動態的gif圖記憶體峰值更加的高,記憶體釋放不會及時。
1、利用CADisplayLink開啟一個時鐘,每次觸發只載入一幀影像!而之前的影像立即釋放。
2、用加時鐘的方式來解決記憶體過大的問題,會造成額外的開銷。可以將動態圖片的載入換成YYAnimatedImageView。
問題三:
平時你是如何對程式碼進行效能優化的呢?
答:利用效能分析工具檢測,使用instrument除錯介面卡頓,timer Profiler用來看cpu的佔比,core animation用來獲取圖形的繪製情況。使用靜態工具analyze分析程式碼的宣告錯誤、邏輯錯誤、Api呼叫錯誤或記憶體管理錯誤。
問題四:
如何對I/O進行效能優化?
答:將零碎的內容作為一個整體進行寫入;使用合適的 I/O 操作 API;使用合適的執行緒;使用 NSCache 做快取達到減少 I/O操作的效果。
視訊地址: 效能優化詳解
相關文章
- 「mysql優化專題」程式設計師面試都用得上的索引優化手冊(5)【面試重點】MySql優化程式設計師面試索引
- 好程式設計師:Java程式設計師面試秘籍程式設計師Java面試
- 程式設計師程式碼面試指南程式設計師面試
- 程式設計師面試經驗程式設計師面試
- 程式設計師菜鳥面試攻略程式設計師面試
- 前端程式設計師面試十八套路前端程式設計師面試
- IT程式設計師面試技巧有哪些?程式設計師面試
- 【程式設計師面試金典】20180801程式設計師面試
- 【程式設計師面試金典】洪水程式設計師面試
- 好程式設計師Python培訓分享Python程式設計師面試技巧程式設計師Python面試
- 面試題:webpack之效能優化面試題Web優化
- 好程式設計師web前端教程分享常見基礎面試題之效能最佳化程式設計師Web前端面試題
- 智力題(程式設計師面試經典)程式設計師面試
- Java程式設計師面試題及解答Java程式設計師面試題
- 程式設計師50+Java面試題程式設計師Java面試題
- 程式設計師面試所需的軟技能程式設計師面試
- JAVA程式設計師面試題庫分享Java程式設計師面試題
- 程式設計師那些牛B閃閃的禁術程式設計師
- 準備程式設計師面試?你需要了解這 14 種程式設計面試模式程式設計師面試模式
- 優秀程式設計師都在用哪些Chrome擴充工具?程式設計師Chrome
- [推廣] 程式設計師的痛點:我竟然還不懂 Linux 效能優化程式設計師Linux優化
- 5年程式設計師面試,常見面試問題解析程式設計師面試
- Java程式設計師面試常見問題Java程式設計師面試
- VUE的面試題分享-好程式設計師Vue面試題程式設計師
- 《程式設計師漫畫》| 萌新面試Google程式設計師面試Go
- 程式設計師面試題!親身經歷!程式設計師面試題
- 程式設計師面試金典Chapter1程式設計師面試APT
- 程式設計師面試如何與HR談薪程式設計師面試
- 好程式設計師Java教程分享Jmeter效能測試程式設計師JavaJMeter
- 程式設計師精進之路:效能調優利器--火焰圖程式設計師
- 【200人面試經驗】,程式設計師面試,常見面試題解析程式設計師面試題
- 【JAVA面試資料】程式設計師面試之葵花寶典2Java面試程式設計師
- 【JAVA面試資料】程式設計師面試之葵花寶典1Java面試程式設計師
- 為什麼高階程式設計師討厭程式設計面試? - Adam程式設計師面試
- 好程式設計師分享Web前端效能最佳化程式設計師Web前端
- 程式設計師面試之MySQL資料庫表的設計程式設計師面試MySql資料庫
- UI設計師面試技巧UI面試
- 新書出版 |《Oracle程式設計師面試筆試寶典》新書Oracle程式設計師面試筆試
- 好程式設計師Java教程分享Java面試妙招程式設計師Java面試