中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

性能優化策略

發布時間:2020-06-15 18:11:57 來源:網絡 閱讀:496 作者:周衛斌 欄目:移動開發

性能問題的處理流程

  • 發現/重現問題

  • 利用工具剖析

  • 形成假設

  • 改進代碼和設計

性能優化策略

在以上的四個步驟中循環反復,直到問題解決。

Profile!不要猜!

性能優化的主要策略:

  • 不要做無用功:不要在啟動時花幾百ms來做logging,不要為同樣的數據做多次查詢

  • 試圖重用:對于創建過程昂貴的對象,要重用而不是重新創建

    • Table View的cell

    • Date/Number的formatter

    • 正則表達式

    • SQLite語句

  • 使用更快的方式設計、編程:選擇正確的集合對象和算法來進行編程、選擇適合的數據存儲格式(plist、SQLite)、優化SQLite查詢語句

  • 事先做優化

    • 對于昂貴的計算,要進行事先計算。iCal中的重復事件,是預先計算出來的,并保存到數據庫中。

    • 事先計算并緩存一些對象,可能會占用大量的內存。注意不要將這些對象聲明為static并常駐內存。

  • 事后做優化:異步加載、懶加載

  • 為伸縮性而做優化:當數據有10條、100條、1000條甚至更多的時候,應用程序的性能不應該對應的呈數量級式的增長,否則無法使用。

說起來慚愧,我真的很少遇到性能問題。以前假設中的性能問題,很多是根本不存在的。事前計劃也杜絕了不了性能問題的產生,所以不如暫時忘記它吧。當然對于一些常識性的提高性能的設計,仍然是必須的。

二:iOS應用啟動速度優化

很多app的開發者都不重視app的啟動速度,這對于碎片化使用情景的用戶來說,簡直是災難。

iOS應用的啟動速度

應用啟動時,會播放一個放大的動畫。iPhone上是400ms,iPad上是500ms。最理想的啟動速度是,在播放完動畫后,用戶就可以使用。

如果應用啟動過慢,用戶就會放棄使用,甚至永遠都不再回來。拋開代碼不談,如果抱著PC端游和單機游戲的思維,在游戲啟動時強加公司Logo,啟動動畫,并且用戶不可跳過,也會使用戶的成功使用率大大降低。

iOS系統的“看門狗"

為了防止一個應用占用過多的系統資源,開發iOS的蘋果工程師門設計了一個“看門狗”的機制。在不同的場景下,“看門狗”會監測應用的性能。如果超出了該場景所規定的運行時間,“看門狗”就會強制終結這個應用的進程。開發者們在crashlog里面,會看到諸如0x8badf00d這樣的錯誤代碼(“看門狗”吃了壞的食物,它很不高興)。

場景“看門狗”超時時間
啟動20秒
恢復運行10秒
懸掛進程10秒
退出應用6秒
后臺運行10分鐘

值得注意的是,Xcode在Debug的時候,會禁止“看門狗”。

如何測試啟動時間

兩種方法:一種使用NSLog,另外一種使用Time Profiler。

  • 使用NSLog

 1 CFAbsoluteTime StartTime; 2 int main(int argc, char **argv) { 3      StartTime = CFAbsoluteTimeGetCurrent(); 4      // ... 5 } 6  7 - (void)applicationDidFinishLaunching:(UIApplication *)app { 8      dispatch_async(dispatch_get_main_queue(), ^{ 9         NSLog(@"Launched in %f sec", CFAbsoluteTimeGetCurrent() - StartTime);10      });11      // ...12  }
  • 使用Time Profiler

    • Instruments->Time Profiler

    • Profile你的app

    • 切換到CPU strategy view,找到你的app啟動的第一幀

    • 搜索-[UIApplication _reportAppLaunchFinished]

    • 找到包含-[UIApplication _reportAppLaunchFinished]的最后一幀,即可計算出啟動時間

iOS App啟動過程

  • 鏈接并加載Framework和static lib

  • UIKit初始化

  • 應用程序callback

  • 第一個Core Animation transaction

鏈接并加載Framework及static lib時需要注意:

  • 每個Framework都會增加啟動時間和占用的內存

  • 不必要的Framework,不要鏈接

  • 必要的Framework,不要票房為Optional

  • 只在使用在Deployment Target之后發布的Framework時,才使用Optional(比如你的Deployment Target是iOS 3.0,需要鏈接StoreKit的時候)

  • 避免創建全局的C++對象

初始化UIKit時需要注意:

  • 字體、狀態欄、user defaults、main nib會被初始化

  • 保持main nib盡可能的小

  • User defaults本質上是一個plist文件,保存的數據是同時被反序列化的,不要在user defaults里面保存圖片等大數據

應用程序的回調:

  • application:willFinishLaunchingWithOptions:

  • 恢復應用程序的狀態

  • application:didFinishLaunchingWithOptions:

我一直認為設計的本質是折衷。當你為了100ms的啟動速度優化歡欣不已,而無視那長達10秒的啟動動畫時,應該想想究竟什么是應該做的。做正確的事情比把事情做好更重要。

三:事件處理-拯救主線程

用戶經常評論app的一個用詞是“卡頓”,很大的因素是因為主線程被占用了。用戶的事件


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衡山县| 武川县| 清远市| 和田县| 慈利县| 合江县| 香格里拉县| 兴化市| 九江市| 安远县| 琼中| 叙永县| 高青县| 新民市| 湾仔区| 犍为县| 根河市| 康定县| 南京市| 航空| 南岸区| 外汇| 赣榆县| 惠东县| 张家口市| 长治市| 靖安县| 南开区| 卢龙县| 淳安县| 廊坊市| 神池县| 乌兰县| 景谷| 江北区| 河津市| 普陀区| 商城县| 东方市| 义马市| 澳门|