精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS性能優(yōu)化系列

移動開發(fā) iOS
說起來慚愧,我真的很少遇到性能問題。以前假設(shè)中的性能問題,很多是根本不存在的。事前計劃也杜絕了不了性能問題的產(chǎn)生,所以不如暫時忘記它吧。當(dāng)然對于一些常識性的提高性能的設(shè)計,仍然是必須的。

這一系列文章是我的讀書筆記,整理一下,也算是溫故而知新。

性能問題的處理流程

  • 發(fā)現(xiàn)/重現(xiàn)問題
  • 利用工具剖析
  • 形成假設(shè)
  • 改進代碼和設(shè)計

在以上的四個步驟中循環(huán)反復(fù),直到問題解決。

Profile!不要猜!

性能優(yōu)化的主要策略:

  • 不要做無用功:不要在啟動時花幾百ms來做logging,不要為同樣的數(shù)據(jù)做多次查詢
  • 試圖重用:對于創(chuàng)建過程昂貴的對象,要重用而不是重新創(chuàng)建
    • Table View的cell
    • Date/Number的formatter
    • 正則表達式
    • SQLite語句
  • 使用更快的方式設(shè)計、編程:選擇正確的集合對象和算法來進行編程、選擇適合的數(shù)據(jù)存儲格式(plist、SQLite)、優(yōu)化SQLite查詢語句
  • 事先做優(yōu)化
    • 對于昂貴的計算,要進行事先計算。iCal中的重復(fù)事件,是預(yù)先計算出來的,并保存到數(shù)據(jù)庫中。
    • 事先計算并緩存一些對象,可能會占用大量的內(nèi)存。注意不要將這些對象聲明為static并常駐內(nèi)存。
  • 事后做優(yōu)化:異步加載、懶加載
  • 為伸縮性而做優(yōu)化:當(dāng)數(shù)據(jù)有10條、100條、1000條甚至更多的時候,應(yīng)用程序的性能不應(yīng)該對應(yīng)的呈數(shù)量級式的增長,否則無法使用。

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

二:iOS應(yīng)用啟動速度優(yōu)化

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

iOS應(yīng)用的啟動速度

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

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

iOS系統(tǒng)的“看門狗"

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

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

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

如何測試啟動時間

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

  • 使用NSLog
  •  
    1. 1 CFAbsoluteTime StartTime;  
    2. int main(int argc, char **argv) {  
    3. 3      StartTime = CFAbsoluteTimeGetCurrent(); 
    4.  4      // ...  5 }  6   
    5. 7 - (void)applicationDidFinishLaunching:(UIApplication *)app {  
    6. 8      dispatch_async(dispatch_get_main_queue(), ^{  
    7. 9         
    8. NSLog(@"Launched in %f sec", CFAbsoluteTimeGetCurrent() - StartTime); 
    9. 10      
    10. }); 11      // ... 12  }  
  • 使用Time Profiler
    • Instruments->Time Profiler
    • Profile你的app
    • 切換到CPU strategy view,找到你的app啟動的第一幀
    • 搜索-[UIApplication _reportAppLaunchFinished]
    • 找到包含-[UIApplication _reportAppLaunchFinished]的最后一幀,即可計算出啟動時間

iOS App啟動過程

  • 鏈接并加載Framework和static lib
  • UIKit初始化
  • 應(yīng)用程序callback
  • 第一個Core Animation transaction

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

  • 每個Framework都會增加啟動時間和占用的內(nèi)存
  • 不必要的Framework,不要鏈接
  • 必要的Framework,不要票房為Optional
  • 只在使用在Deployment Target之后發(fā)布的Framework時,才使用Optional(比如你的Deployment Target是iOS 3.0,需要鏈接StoreKit的時候)
  • 避免創(chuàng)建全局的C++對象

初始化UIKit時需要注意:

  • 字體、狀態(tài)欄、user defaults、main nib會被初始化
  • 保持main nib盡可能的小
  • User defaults本質(zhì)上是一個plist文件,保存的數(shù)據(jù)是同時被反序列化的,不要在user defaults里面保存圖片等大數(shù)據(jù)

應(yīng)用程序的回調(diào):

  • application:willFinishLaunchingWithOptions:
  • 恢復(fù)應(yīng)用程序的狀態(tài)
  • application:didFinishLaunchingWithOptions:

我一直認(rèn)為設(shè)計的本質(zhì)是折衷。當(dāng)你為了100ms的啟動速度優(yōu)化歡欣不已,而無視那長達10秒的啟動動畫時,應(yīng)該想想究竟什么是應(yīng)該做的。做正確的事情比把事情做好更重要。

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

用戶經(jīng)常評論app的一個用詞是“卡頓”,很大的因素是因為主線程被占用了。用戶的事件是在主線程被處理的,包括點擊、滾動、加速計、Proximity Sensor。

為了保證事件的平滑處理,需要進行如下優(yōu)化:

  • 最小化主線程的CPU占用
  • 將工作“搬離”主線程
  • 不要阻塞主線程

最小化主線程的CPU占用

前面兩篇文章,我們接觸到了Time Profiler。使用它可以剖析不同線程的CPU使用情況,并給出調(diào)用堆棧的CPU時間占用百分比。如果app“卡頓”,并且在Time Profiler的結(jié)果可以找到明確的高占用堆棧,你需要把它優(yōu)化掉。

將工作“搬離”主線程 - 隱式并發(fā)

為了得到更流暢的交互體驗,iOS已經(jīng)幫我們做了很多事情,Android就沒有這么好運了。iOS將以下這些事情搬離了主線程:

  • View和layer的動畫(動畫繪制前的計算,而不是drawing過程)
  • Layer的組合計算(drawing后的疊加)
  • PNG的解碼(是的,你沒看錯;而且利用了CPU的多核心)

注意滾動(Scrolling)不是一個動畫,而是在Main Run Loop中不斷接收事件并且處理。

將工作“搬離”主線程 - 顯式并發(fā)

這里是需要開發(fā)者們搞定的部分。磁盤、網(wǎng)絡(luò)等I/O會阻塞線程,不要把它們放到主線程里。常用的技術(shù)有:

  • Grand Central Dispatch(GCD)
  • NSOperationQueue
  • NSThread

iOS 4.0后,易用的GCD技術(shù)被廣泛使用。例如:

 

  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
  2. ^{    
  3.  // do something in background     dispatch_async(dispatch_get_main_queue(), ^{        
  4.  // do something on main thread    
  5.  }); }); 

GCD的陷阱

GCD其實就是線程,只不過提供了一個更高層次的抽象。過多的線程一定會帶來性能損失,因此GCD設(shè)計了一個最高允許的線程值(對開發(fā)者透明,不用管到底有多少)。那么如何解決這個問題呢?

  • 將隊列串行化
  • 使用Dispatch sources
  • 使用帶有限制的NSOperationQueue
  • 使用Cocoa Touch提供的異步方法

另外一個陷阱是線程安全:

  • UIKit必須要在主線程使用,除了UIGraphics,UIBezierPath,UIImage
  • 大多數(shù)CG、CA、Foundation的類,不是線程安全的
  • 如果你使用了ojbc runtime來進行introspection,由于它是thread safe的,可能會導(dǎo)致競爭

此外,iOS 4.3添加了DISPATCH_QUEUE_PRIORITY_BACKGROUND,它擁有非常低的優(yōu)先級。這個優(yōu)先級只用于不太關(guān)心完成時間的真正的后臺任務(wù),如果要表示較低的優(yōu)先級,你通常需要的是DISPATCH_QUEUE_PRIORITY_LOW

不要阻塞主線程

即使占用了很少的CPU時間(如果你在Time Profiler中看到這些的數(shù)據(jù)),也可能會阻塞主線程。磁盤、網(wǎng)絡(luò)、Lock、dispatch_sync以及向其它進程/線程發(fā)送消息都會阻塞主線 程。Time Profiler只能檢測出占用CPU過多的堆棧,但檢測不了這些IO的問題。

大多數(shù)的阻塞事件,都會伴隨著一個系統(tǒng)調(diào)用,如:

  • read/write - 讀寫文件
  • send/recv - 收發(fā)網(wǎng)絡(luò)數(shù)據(jù)
  • psynch_mutex_wait - 獲得鎖
  • mach_msg - IPC

System Trace這個Instrumentor,記錄了所有的系統(tǒng)調(diào)用,以及每次調(diào)用的等待時間。如果你在System Trace里面發(fā)現(xiàn)了CPU Time很低,但Wait Time很高的調(diào)用,說明在主線程處理I/O已經(jīng)嚴(yán)重?fù)p害了app的性能。

保證主線程的低CPU占用,將I/O移至其它線程,可以大大地提高主線程對交互事件的處理能力。我建議開發(fā)者朋友們寫代碼的時候,除非是以前遇到過的問題,都沒有必要假設(shè)問題存在。80%的優(yōu)化都是不必要的。

 

責(zé)任編輯:張葉青 來源: 博客
相關(guān)推薦

2019-07-25 13:22:43

AndroidAPK文件優(yōu)化

2021-11-09 09:57:46

Webpack 前端分包優(yōu)化

2022-03-29 13:27:22

Android優(yōu)化APP

2022-07-19 16:47:53

Android抖音

2021-09-03 09:44:13

移動端性能優(yōu)化U-APM

2017-01-19 19:07:28

iOS進階性能優(yōu)化

2022-04-28 15:07:41

抖音內(nèi)存泄漏Android

2019-03-21 14:18:38

iOS開發(fā)優(yōu)化原因

2018-05-16 07:41:29

圖片代碼資源

2025-06-03 00:00:06

性能優(yōu)化性能指標(biāo)響應(yīng)時間

2013-12-17 17:05:20

iOS性能優(yōu)化

2014-12-10 10:12:02

Web

2011-08-03 16:51:01

jQuery

2021-11-29 11:13:45

服務(wù)器網(wǎng)絡(luò)性能

2022-02-16 14:10:51

服務(wù)器性能優(yōu)化Linux

2009-09-08 09:45:23

App Engine性

2020-09-19 21:26:56

webpack

2013-06-09 15:31:35

jQueryjQuery優(yōu)化性能優(yōu)化

2009-06-16 16:10:59

Hibernate性能

2017-08-08 09:45:43

Python性能優(yōu)化
點贊
收藏

51CTO技術(shù)棧公眾號

成人av午夜影院| 小说区亚洲自拍另类图片专区 | 日韩午夜激情电影| 欧美精品卡一卡二| 懂色av中文在线| 国产麻豆9l精品三级站| 国外成人性视频| 人人艹在线视频| 超碰在线成人| 欧美性猛交xxxxxxxx| www.男人天堂网| av在线女优影院| 成人a免费在线看| 成人av番号网| 超碰超碰超碰超碰| 欧美日韩在线大尺度| 亚洲色图激情小说| 国产调教打屁股xxxx网站| 欧美特大特白屁股xxxx| 一区二区三区四区精品在线视频 | 国产欧美一区二| 国产剧情av在线播放| 中文字幕欧美日韩一区| 国产有色视频色综合| 亚洲综合一区中| 亚洲在线网站| 国语对白做受69| 婷婷伊人五月天| 欧美军人男男激情gay| 亚洲国产欧美一区| 日本一二三四区视频| 日本综合视频| 91久久人澡人人添人人爽欧美| 欧美性猛交内射兽交老熟妇| 91xxx在线观看| 久久综合色8888| 国产精品一区二区三区精品| 国产精品污视频| 青青草91视频| 日韩免费在线播放| 人人干人人干人人干| 欧美日本不卡| 欧美成人精品在线观看| 娇小11一12╳yⅹ╳毛片| 欧美热在线视频精品999| 亚洲精品国产精品久久清纯直播| 麻豆传媒在线看| 久久影院一区二区三区| 欧美高清dvd| 激情五月婷婷基地| 欧美亚洲综合视频| 欧美日本一区二区在线观看| 成人性生生活性生交12| 日韩美女在线看免费观看| 福利视频导航一区| 美女福利视频在线| 日韩精品一区二区三区| 一本一道久久a久久精品| 欧美精品色婷婷五月综合| 日本不良网站在线观看| 欧美视频一区二区三区…| 日韩av综合在线观看| 欧美freesex黑人又粗又大| 五月天亚洲精品| 国内自拍在线观看| 亚洲校园激情春色| 欧美伊人精品成人久久综合97| 能看的毛片网站| 国产极品嫩模在线观看91精品| 欧美午夜精品免费| 一区二区免费av| 国产精品3区| 欧美一区二区三区婷婷月色 | 99久久精品国产导航| 精品午夜一区二区| 国产高清自拍视频在线观看| 国产精品无遮挡| 国产又粗又爽又黄的视频| 三级福利片在线观看| 亚洲国产视频a| 免费高清在线观看免费| 91大神在线观看线路一区| 欧美日本一区二区三区四区| 免费不卡av网站| 久久影院资源站| 尤物yw午夜国产精品视频| 色婷婷粉嫩av| 激情偷拍久久| 国产精品久久99久久| 99久久精品免费看国产交换| 国产69精品久久777的优势| 久久久影院一区二区三区| 日本免费在线视频| 亚洲国产wwwccc36天堂| 免费在线激情视频| www.91精品| 亚洲精品自拍视频| 日本成人精品视频| 国产精品久久久久久久久久妞妞| 国产精品欧美风情| 人妻中文字幕一区| 国产精品第13页| 免费看国产曰批40分钟| 日本中文字幕视频一区| 精品日韩在线观看| 成人信息集中地| 国产亚洲在线| 999视频在线观看| 国产三级在线| 午夜不卡av免费| 一级片黄色免费| 欧美一区电影| 97色在线视频观看| 国产成人麻豆精品午夜在线| 久久综合久久99| 亚洲精品久久久久久久蜜桃臀| 51一区二区三区| 国产手机视频精品| 久久久久久久国产精品毛片| 美女视频黄 久久| 久热这里只精品99re8久| 制服丝袜中文字幕在线| 欧美在线观看一二区| 五级黄高潮片90分钟视频| 欧美99在线视频观看| 国产欧美一区二区| 日本一级在线观看| 亚洲国产精品一区二区尤物区| 亚洲va在线va天堂va偷拍| 精品国产欧美日韩| 日韩av片电影专区| 性感美女一级片| 亚洲观看高清完整版在线观看| 一本之道在线视频| 小小影院久久| 成人黄色免费看| 在线播放毛片| 欧美三级韩国三级日本一级| 偷拍夫妻性生活| 久久精品女人| 久久久久久99| 中文字幕这里只有精品| 亚洲国产成人精品女人久久久| 全程偷拍露脸中年夫妇| 国产尤物一区二区在线| 亚洲一区二区三区免费观看| 成人日韩在线| 在线色欧美三级视频| www.五月婷婷.com| 欧美国产欧美综合| 天天色综合天天色| 久久中文亚洲字幕| 国产在线播放不卡| 污的网站在线观看| 亚洲白拍色综合图区| 国产在线视频99| 不卡av在线网| 久草综合在线观看| 成人激情视频| 亚洲va电影大全| 国产盗摄精品一区二区酒店| 亚洲国产高清自拍| 男人午夜免费视频| 中文字幕欧美日本乱码一线二线 | 日韩成人一区| 麻豆乱码国产一区二区三区| 国产欧美综合视频| 亚洲福利视频一区| 久久人人妻人人人人妻性色av| 欧美专区一区二区三区| 四虎永久在线精品免费一区二区| 成人精品三级| 欧美猛少妇色xxxxx| 日韩中文字幕免费观看| 色哟哟精品一区| 潮喷失禁大喷水aⅴ无码| 国产美女精品人人做人人爽| www.日本少妇| 欧美一二区在线观看| 亚洲自拍欧美色图| 手机在线理论片| 最近2019中文字幕大全第二页 | 久久亚洲天堂网| 日本一区二区成人| 亚洲AV成人精品| 日韩电影在线观看一区| 椎名由奈jux491在线播放| 最新国产一区二区| 国产成人亚洲综合青青| 在线āv视频| 亚洲视频欧洲视频| 精品国产av一区二区| 欧美日韩亚洲精品内裤| 亚洲精品久久久久久国| 99久久夜色精品国产网站| 天堂av在线网站| 在线精品一区二区| 亚洲第一导航| 日韩一级电影| 亚洲一区二区中文| 亚洲一区二区三区四区| 欧美激情高清视频| 日韩大片在线永久免费观看网站| 精品国产免费人成在线观看| 青青国产在线视频| 亚洲午夜日本在线观看| 欧美肥妇bbwbbw| 26uuu另类欧美| 久久久无码人妻精品无码| 美女久久久精品| a√天堂在线观看| 欧美精品18| 中日韩在线视频| 国产成人短视频在线观看| 国产精品美女诱惑| 日韩精品成人| 国产在线视频2019最新视频| 丝袜美腿一区| 日本亚洲欧洲色| free性m.freesex欧美| 欧美成人黑人xx视频免费观看| 国际av在线| 日韩精品在线免费播放| 亚洲精品视频专区| 欧美一级片在线观看| 一区二区三区免费在线| 在线日韩一区二区| 久久久精品视频网站| 亚洲va天堂va国产va久| 久久亚洲精品大全| 亚洲一区在线观看网站| 久久久久亚洲av片无码| 国产精品国产三级国产aⅴ入口| 亚洲AV无码成人精品区明星换面| 91在线码无精品| 亚洲久久久久久| av在线不卡电影| 精品熟女一区二区三区| 国产福利一区在线| avtt中文字幕| av在线不卡免费看| 完美搭档在线观看| 99精品欧美一区二区蜜桃免费| 老司机午夜免费福利| 粉嫩蜜臀av国产精品网站| 免费看三级黄色片| 成人午夜伦理影院| www.com日本| 99久久久久免费精品国产 | 国产欧美视频在线观看| 亚洲精品午夜视频| 中文字幕精品综合| av资源在线免费观看| 中文字幕一区二区三中文字幕| 自拍偷拍第9页| 亚洲久草在线视频| 日本在线观看视频网站| 色综合久久久久综合体| 日韩中文字幕高清| 欧美精品色一区二区三区| 一级全黄裸体免费视频| 欧美一级免费大片| 亚洲欧美激情另类| 亚洲免费影视第一页| 91在线高清| 久久久精品999| xxxx在线视频| 国产精品第8页| av在线国产精品| 国产在线一区二区三区播放| 婷婷精品视频| 亚洲一一在线| 国产一区清纯| 超碰影院在线观看| 国产一区二区三区高清播放| 国产精品偷伦视频免费观看了| av午夜精品一区二区三区| 色欲狠狠躁天天躁无码中文字幕 | 美女网站视频一区| 91久久精品美女高潮| 国产suv精品一区| 欧洲一区二区在线| 一级毛片免费高清中文字幕久久网| 日韩视频一二三| 久久xxxx精品视频| 一区二区三区四区毛片| 99久久久精品| 亚洲人做受高潮| 懂色aⅴ精品一区二区三区蜜月| www.久久网| 精品不卡在线视频| bbbbbbbbbbb在线视频| 欧美精品在线免费播放| 欧美特大特白屁股xxxx| 91影院未满十八岁禁止入内| 亚洲第一福利社区| 日本黄网站色大片免费观看| 免费亚洲一区| 精品国产一二区| 中文幕一区二区三区久久蜜桃| 日本免费在线播放| 欧美日韩精品高清| 午夜在线视频观看| 欧美成在线视频| 久久精品xxxxx| 久久精品aaaaaa毛片| 欧美成人中文| 婷婷六月天在线| 久久夜色精品国产噜噜av| 天天干中文字幕| 欧美老年两性高潮| 久草福利在线视频| 久久久中精品2020中文| 国产一区二区色噜噜| 欧美日韩精品免费观看视一区二区| 在线中文字幕第一区| 国产嫩草在线观看| 2024国产精品| 日韩成人一区二区三区| 欧美一区二区三区免费观看视频| 可以在线观看的av| 777精品视频| 成人台湾亚洲精品一区二区| 亚洲欧美日韩不卡| 男女性色大片免费观看一区二区| 亚洲精品乱码久久久久久久| 亚洲已满18点击进入久久| 91成品人影院| 中文字幕亚洲欧美日韩2019| 欧美专区福利免费| 欧美高清性xxxxhd| 久久精品二区三区| 亚洲激情视频小说| 色94色欧美sute亚洲13| 日本一区高清| 国产成人激情小视频| 伊人久久大香线蕉综合网蜜芽| heyzo亚洲| 97超碰欧美中文字幕| 国产成人无码精品亚洲| 亚洲福利小视频| 亚洲美女尤物影院| 你懂的视频在线一区二区| 国产欧美大片| 久久久无码人妻精品一区| 精品久久久久国产| 亚洲色图21p| 国产mv久久久| 精品免费一区二区| 自拍偷拍一区二区三区四区| 国产精品天天看| 国产一区二区网站| 九九视频这里只有精品| 91蝌蚪精品视频| 热99这里只有精品| 久久影院午夜片一区| 久久精品偷拍视频| 久久精品视频免费播放| 日韩高清二区| 蜜臀av色欲a片无码精品一区| 成人免费视频网站在线观看| 日本中文字幕网| 亚洲天堂开心观看| 日本成人在线网站| 久久久久久久香蕉| 99久久久免费精品国产一区二区| 69亚洲精品久久久蜜桃小说| 日韩专区在线播放| 日韩精品一区二区三区中文在线 | 日产欧产美韩系列久久99| 欧美h片在线观看| 日韩免费福利电影在线观看| 1区2区在线| 色一情一乱一伦一区二区三欧美| 久久99蜜桃精品| 久草免费新视频| 亚洲女人天堂成人av在线| av成人在线播放| 欧美黄网在线观看| 久久婷婷综合激情| 国产乱码一区二区| 97视频在线观看视频免费视频 | 91成人精品网站| re久久精品视频| 日本女人性视频| 日韩欧美国产激情| av黄色在线| 欧美日韩国产综合视频在线| 国产美女一区二区三区| 久久精品无码av| 欧美成人四级hd版| 国产精品一线天粉嫩av| 国产精品久久久久野外| 高跟丝袜欧美一区| 国产在线高清理伦片a| 久久精品成人一区二区三区蜜臀| 韩国视频一区二区| 精品国产午夜福利| 欧美大片在线免费观看| 北条麻妃国产九九九精品小说|