App Programming Guide for iOS -> 性能技巧(一)

開發(fā)應(yīng)用的每一步,都需要考慮你的設(shè)計(jì)選擇對(duì)應(yīng)用整體性能的影響。電量使用和內(nèi)存消耗是iOS應(yīng)用重點(diǎn)考慮的因素涂籽。當(dāng)然還有很多值的考慮的因素。接下來的部分砸抛,描述了整個(gè)開發(fā)過程需要考慮的因素评雌。

減少應(yīng)用的電量消耗

耗電量一直是移動(dòng)設(shè)備的問題。iOS的電量管理系統(tǒng)通過關(guān)閉當(dāng)前不使用的硬件功能來節(jié)省電量直焙。你可以通過優(yōu)化使用下列功能來幫助延長電池壽命:

  • CPU
  • Wi-Fi, Bluetooth, 以及基帶(EDGE, 3G)無線電
  • Core Location框架
  • 加速計(jì)
  • 磁盤

優(yōu)化的目標(biāo)應(yīng)該是用最少的電量做最多的事景东。你應(yīng)該始終使用Instruments來優(yōu)化應(yīng)用的算法。但是奔誓,即便是最優(yōu)化的算法也會(huì)對(duì)設(shè)備的電池壽命產(chǎn)生負(fù)面的影響斤吐。因此在編寫代碼的時(shí)候要考慮下面的準(zhǔn)則:

  • 避免進(jìn)行要求輪詢的工作。輪詢會(huì)阻止CPU進(jìn)入休眠狀態(tài)厨喂『痛耄可以使用NSRunLoop 或 NSTimer類取代輪詢來安排必要的工作。
  • 盡可能的將UIApplication共享對(duì)象的idleTimerDisabled屬性設(shè)置為NO蜕煌∨哨澹空閑定時(shí)器會(huì)在設(shè)備不操作一段時(shí)間后關(guān)閉屏幕。如果應(yīng)用不需要讓屏幕亮著斜纪,就讓系統(tǒng)關(guān)掉它颁褂。如果應(yīng)用因?yàn)槠聊魂P(guān)閉而產(chǎn)生副作用故响,則應(yīng)該修改代碼來消除副作用,而不必禁用空閑定時(shí)器颁独。
  • 盡可能地合并工作,以便最大化的延長空閑時(shí)間伪冰。一般來說誓酒,一次執(zhí)行一組計(jì)算任務(wù)所耗電量要比在較長時(shí)間內(nèi)多次執(zhí)行一小部分來的更少。因?yàn)橹芷谛缘膱?zhí)行少量任務(wù)會(huì)頻繁的喚醒CPU執(zhí)行任務(wù)贮聂。
  • 避免頻繁的訪問磁盤靠柑。例如,如果應(yīng)用保存狀態(tài)信息到磁盤吓懈,只需要在狀態(tài)信息改變的時(shí)候進(jìn)行即可歼冰,并盡可能的合并更改來避免頻繁的寫入小的改變。
  • 不要超出需求的繪制屏幕耻警。對(duì)于耗電量來說繪制是一個(gè)昂貴的操作隔嫡。不要依靠硬件來調(diào)節(jié)幀速率。要根據(jù)實(shí)際需要來繪制幀甘穿。
  • 如果你使用UIAccelerometer 類來接收常規(guī)加速計(jì)事件腮恩,那在你不需要時(shí)禁止傳遞這些事件。類似的温兼,將事件傳送的頻率設(shè)置為你需要的最小值秸滴。更多信息,參見Event Handling Guide for UIKit Apps募判。

傳輸?shù)骄W(wǎng)絡(luò)的數(shù)據(jù)越多荡含,運(yùn)行無線電所消耗的電量就越大。事實(shí)上届垫,訪問網(wǎng)絡(luò)是功耗最大的操作释液。你可以通過下面的指導(dǎo)來最小化使用時(shí)間。

  • 只在必要的時(shí)候才連接外部網(wǎng)絡(luò)服務(wù)敦腔,并且不要輪詢這些服務(wù)均澳。
  • 當(dāng)你必須連接網(wǎng)絡(luò)的時(shí)候,根據(jù)需要最小化數(shù)據(jù)傳輸符衔。使用緊湊的數(shù)據(jù)格式找前,不要包含被忽略的多余內(nèi)容。
  • 短暫大量的傳輸要好于長時(shí)少量的傳輸判族。系統(tǒng)在檢測到網(wǎng)絡(luò)信號(hào)活躍度不夠的時(shí)候躺盛,會(huì)關(guān)閉Wi-Fi或者基站無線電。當(dāng)系統(tǒng)在長時(shí)間的傳輸數(shù)據(jù)的時(shí)候形帮,它比起在短時(shí)間內(nèi)傳遞同樣數(shù)量的數(shù)據(jù)所消耗的電量更少槽惫。當(dāng)使用NSURLSession類來排列多個(gè)上傳和下載的任務(wù)時(shí)周叮,將它們安排進(jìn)隊(duì)列,而不是等一個(gè)完成了再開始第二個(gè)界斜。系統(tǒng)會(huì)自動(dòng)管理這個(gè)隊(duì)列以最有效的方式執(zhí)行仿耽。
  • 盡可能的使用Wi-Fi來連接網(wǎng)絡(luò)。Wi-Fi要比蜂窩無線電小號(hào)更少的能量各薇。
  • 如果你使用Core Location框架來采集位置數(shù)據(jù)项贺,一旦有可能就禁用位置更新,并且設(shè)置合適的距離過濾器和精度等級(jí)的值峭判。Core Location 使用GPS开缎、基站、以及Wi-Fi網(wǎng)絡(luò)來確定用戶的位置林螃。雖然Core Locatioin盡量少的使用這些無線電奕删,但是設(shè)置合適的精度和過濾器的值可以讓Core Location在不需要的時(shí)候完全關(guān)閉硬件。更多信息疗认,參見Location and Maps Programming Guide完残。

Instruments應(yīng)用包含多個(gè)收集點(diǎn)亮相關(guān)信息的工具。你可以使用這些工具來收集關(guān)于電量消耗的信息侮邀,并收集對(duì)諸如Wi-Fi和藍(lán)牙無線點(diǎn)坏怪、GPS服務(wù)、顯示绊茧、以及CPU等硬件的特定測量數(shù)據(jù)铝宵。你可以啟用在設(shè)備上的Energy Diagnostics Logging(能量診斷日志)來收集信息。關(guān)于使用Instruments來搜集電量相關(guān)數(shù)據(jù)的信息华畏,參見Instruments User Guide鹏秋。關(guān)于如何啟用Energy Diagnostics Logging,參見Instruments Help亡笑。

高效的使用內(nèi)存

鼓勵(lì)應(yīng)用盡可能少的使用內(nèi)存侣夷,以便系統(tǒng)可以保留更多應(yīng)用在內(nèi)存中,或者將跟多的內(nèi)存留給前臺(tái)應(yīng)用仑乌。大量的可用系統(tǒng)空閑內(nèi)存和應(yīng)用的性能之間存在著直接的關(guān)系百拓。較少的可用系統(tǒng)內(nèi)存會(huì)在功能請求內(nèi)存的時(shí)候出現(xiàn)問題。

為了確蔽酰總是有足夠的可用內(nèi)存衙传,你應(yīng)該最小化應(yīng)用的內(nèi)存使用,并且當(dāng)系統(tǒng)要求你釋放內(nèi)存的時(shí)候做出響應(yīng)厕九。

觀察低內(nèi)存警告

當(dāng)系統(tǒng)向應(yīng)用發(fā)送低內(nèi)存警告的時(shí)候蓖捶,立刻響應(yīng)。低內(nèi)存警告是移你不需要的對(duì)象的引用的機(jī)會(huì)扁远。響應(yīng)這些警告至關(guān)重要俊鱼,因?yàn)閼?yīng)用這可能會(huì)導(dǎo)致應(yīng)用終止刻像。系統(tǒng)使用下面幾個(gè)APIs來向應(yīng)用傳遞內(nèi)存警告:

  • 應(yīng)用委托的applicationDidReceiveMemoryWarning:方法。
  • UIViewController類的didReceiveMemoryWarning方法并闲。
  • UIApplicationDidReceiveMemoryWarningNotification 通知细睡。
  • 調(diào)度DISPATCH_SOURCE_TYPE_MEMORYPRESSURE類型資源。這個(gè)技術(shù)是唯一能讓你可以區(qū)分內(nèi)存壓力嚴(yán)重性的技術(shù)帝火。

當(dāng)接到其中任意一個(gè)警告的時(shí)候纹冤,你應(yīng)該通過里脊釋放不必要的內(nèi)存來響應(yīng)。使用這些警告來清理緩存和釋放圖片购公。如果你有沒有在使用的大型數(shù)據(jù)結(jié)構(gòu),把這些結(jié)構(gòu)寫入磁盤雁歌,并釋放數(shù)據(jù)的內(nèi)存副本宏浩。

如果你的數(shù)據(jù)模型包括了已知的可清除的資源,你可以為UIApplicationDidReceiveMemoryWarningNotification通知提供一個(gè)相應(yīng)的管理對(duì)象注冊靠瞎,并直接刪除對(duì)它的可清除資源的強(qiáng)引用比庄。這樣可以直接處理這個(gè)通知而無須路由整個(gè)內(nèi)存警告。

注意:你可以在低內(nèi)存條件下使用iOS模擬器中的Simulate Memory Warning (模擬內(nèi)存警告)命令來測試應(yīng)用行為乏盐。

減少應(yīng)用的內(nèi)存占用

從占用較少的內(nèi)存開始佳窑,之后根據(jù)需要擴(kuò)大應(yīng)用的內(nèi)存占用空間。表7-1列出了一些如何減少應(yīng)用整體內(nèi)存專用的技巧父能。

表7-1 減少應(yīng)用內(nèi)存占用的技巧

技巧 采取的行動(dòng)
消除內(nèi)存占用 因?yàn)閮?nèi)存在iOS中是至關(guān)重要的資源神凑,應(yīng)用不應(yīng)該有內(nèi)存泄露。使用Instruments應(yīng)用來跟蹤代碼中的泄漏何吝,可以使用模擬器也可以使用真實(shí)設(shè)備溉委。更多關(guān)于使用Instruments的信息,參見Instruments User Guide爱榕。
盡可能小的制作資源文件 文件位于磁盤瓣喊,但是使用的時(shí)候必須加載到內(nèi)存中。壓縮圖片文件黔酥,使它們盡可能的小藻三。(使用pngcrush工具把圖片壓縮為PNG格式,一種iOS應(yīng)用偏愛的圖片格式跪者。)你可以使用NSPropertyListSerialization類以二進(jìn)制的格式編寫更小的property list文件棵帽。
對(duì)于設(shè)置大型數(shù)據(jù)集使用Core Data或者SQLite 如果應(yīng)用操作大量結(jié)構(gòu)化數(shù)據(jù),應(yīng)該使用Core Data或者SQLite數(shù)據(jù)庫代替文件來進(jìn)行數(shù)據(jù)的持久化坑夯。上述兩種方式可以提供高效的方式管理大型數(shù)據(jù)集岖寞,而無需每次都將整個(gè)數(shù)據(jù)寫入內(nèi)存。
懶加載資源 除非真的需要柜蜈,否則不要加載資源文件仗谆。預(yù)選獲取資源文件可以節(jié)省時(shí)間指巡,但實(shí)際上拖慢了應(yīng)用的速度。另外隶垮,如果你最終不使用資源礼华,加載它就是浪費(fèi)內(nèi)存廊敌。
明智的分配內(nèi)存

表7-2 列出了在應(yīng)用用提高內(nèi)存使用率的技巧。

表7-2 分配內(nèi)存的技巧

技巧 采取的行動(dòng)
限制資源文件的大小 可以用小的資源文件就避免用大的。不要使用高分辨率圖片佩厚,使用基于iOS設(shè)備的合適的尺寸。如果你必須使用大量資源文件昌讲,找到一種方式饶火,只在某一時(shí)刻提供當(dāng)時(shí)需要的文件的部分內(nèi)容。例如威始,比起加載整個(gè)文件到內(nèi)存中枢纠,使用mmap和munmap函數(shù)來映射文件的部分內(nèi)容寫入內(nèi)存或從內(nèi)存中刪除。更多關(guān)于在內(nèi)存中映射文件的信息黎棠,參見File-System Performance Guidelines晋渺。
避免無限問題集 無限問題集可能會(huì)要求大量數(shù)據(jù)的計(jì)算。如果這樣脓斩,應(yīng)用是不能夠完成計(jì)算的木西。應(yīng)用應(yīng)該盡量避免這中情況出現(xiàn),并問題工作在已知的內(nèi)存限制內(nèi)随静。關(guān)于ARC和內(nèi)存管理的具體信息八千,參見Transitioning to ARC Release Notes。

(未完待續(xù) ......)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挪挤,一起剝皮案震驚了整個(gè)濱河市叼丑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扛门,老刑警劉巖鸠信,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異论寨,居然都是意外死亡星立,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門葬凳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绰垂,“玉大人,你說我怎么就攤上這事火焰【⒆埃” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長占业。 經(jīng)常有香客問我绒怨,道長,這世上最難降的妖魔是什么谦疾? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任南蹂,我火速辦了婚禮,結(jié)果婚禮上念恍,老公的妹妹穿的比我還像新娘六剥。我一直安慰自己,他們只是感情好峰伙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布疗疟。 她就那樣靜靜地躺著,像睡著了一般瞳氓。 火紅的嫁衣襯著肌膚如雪秃嗜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天顿膨,我揣著相機(jī)與錄音,去河邊找鬼叽赊。 笑死恋沃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的必指。 我是一名探鬼主播囊咏,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼塔橡!你這毒婦竟也來了梅割?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤葛家,失蹤者是張志新(化名)和其女友劉穎户辞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體癞谒,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡底燎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弹砚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片双仍。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桌吃,靈堂內(nèi)的尸體忽然破棺而出朱沃,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布逗物,位于F島的核電站搬卒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敬察。R本人自食惡果不足惜秀睛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莲祸。 院中可真熱鬧蹂安,春花似錦、人聲如沸锐帜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缴阎。三九已至允瞧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛮拔,已是汗流浹背述暂。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留建炫,地道東北人畦韭。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像肛跌,于是被迫代替她去往敵國和親艺配。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容