iOS性能考慮

在 WWDC 14 的 Keynote 上茫藏,Swift 相比于其他語言的速度優(yōu)勢(shì)被特別進(jìn)行了強(qiáng)調(diào)。但是這種速度優(yōu)勢(shì)是有條件的凉当,雖然由于編譯器的進(jìn)步我們可能可以在不了解語言特性的時(shí)候隨便寫也能得到性能上的改善售葡,但是如果能夠稍微理解背后的機(jī)制的話,我們就能投 “編譯器所好”楼雹,寫出更高效的代碼。

相比于 Objective-C榨咐,Swift 最大的改變就在于方法調(diào)用上的優(yōu)化谴供。在 Objective-C 中,所有的對(duì)于 NSObject 的方法調(diào)用在編譯時(shí)會(huì)被轉(zhuǎn)為 objc_msgSend 方法龟劲。這個(gè)方法運(yùn)用 Objective-C 的運(yùn)行時(shí)特性轴或,使用派發(fā)的方式在運(yùn)行時(shí)對(duì)方法進(jìn)行查找照雁。因?yàn)?Objective-C 的類型并不是編譯時(shí)確定的,我們?cè)诖a中所寫的類型不過只是向編譯器的一種“建議”萍诱,不論對(duì)于怎樣的方法污呼,這種查找的代價(jià)基本都是同樣的。

這個(gè)過程的等效的表述可能類似這樣 (注意這只是一種表述籍凝,與實(shí)際的代碼和工作方式無關(guān)):

// 這個(gè)查找一般需要遍歷類的方法表苗缩,需要花費(fèi)一定時(shí)間
methodToCall = findMethodInClass(class, selector);
// 調(diào)用
methodToCall();  

Objective-C 運(yùn)行時(shí)十分高效酱讶,相比于 I/O 這樣的操作來說,單次的方法派發(fā)和查找并不會(huì)花費(fèi)太多的時(shí)間渊迁,但實(shí)事求是地說灶挟,這確實(shí)也是 Objective-C 性能上可以改進(jìn)的地方,這種改善在短時(shí)間內(nèi)大量方法調(diào)用時(shí)會(huì)比較明顯。

Swift 因?yàn)槭褂昧烁踩蛧?yán)格的類型榛泛,如果我們?cè)诰帉懘a中指明了某個(gè)實(shí)際的類型的話 (注意,需要的是實(shí)際具體的類型孤个,而不是像 Any 這樣的抽象的接口)沛简,我們就可以向編譯器保證在運(yùn)行時(shí)該對(duì)象一定屬于被聲明的類型。這對(duì)編譯器進(jìn)行代碼優(yōu)化來說是非常有幫助的给郊,因?yàn)橛辛烁喔鞔_的類型信息捧灰,編譯器就可以在類型中處理多態(tài)時(shí)建立虛函數(shù)表 (vtable)毛俏,這是一個(gè)帶有索引的保存了方法所在位置的數(shù)組。在方法調(diào)用時(shí)焕蹄,與原來動(dòng)態(tài)派發(fā)和查找方法不同阀溶,現(xiàn)在只需要通過索引就可以直接拿到方法并進(jìn)行調(diào)用了,這是實(shí)實(shí)在在的性能提升迹卢。這個(gè)過程大概相當(dāng)于:

// 直接使用 methodIndex 獲取實(shí)現(xiàn)
let methodToCall = class.vtable[methodIndex]
// 調(diào)用
methodToCall();  

更進(jìn)一步腐碱,在確定的情況下,編譯器對(duì) Swift 的優(yōu)化甚至可以做到將某些方法調(diào)用優(yōu)化為 inline 的形式掉弛。比如在某個(gè)方法被 final 標(biāo)記時(shí)症见,由于不存在被重寫的可能,vtable 中該方法的實(shí)現(xiàn)就完全固定了殃饿。對(duì)于這樣的方法谋作,編譯器在合適的情況下可以在生成代碼的階段就將方法內(nèi)容提取到調(diào)用的地方,從而完全避免調(diào)用乎芳。

通過 Benchmark 我們可以看出遵蚜,在一些基本的算法上逻翁,Swift 的速度是要遠(yuǎn)勝過 Objective-C 的,而就算相較于世界上無可匹敵的 C理郑,也沒有遜色太多。

所以對(duì)于性能方面寂殉,我們應(yīng)該注意的地方就很明顯了囚巴。如果遇到性能敏感和關(guān)鍵的代碼部分,我們最好避免使用 Objective-C 和 NSObject 的子類友扰。在以前我們可能會(huì)選擇使用混編一些 C 或者 C++ 代碼來處理這些關(guān)鍵部分彤叉,而現(xiàn)在我們多了 Swift 這個(gè)選項(xiàng)。相比起 C 或者 C++村怪,Swift 的語言特性上要先進(jìn)得多秽浇,而使用 Swift 類型和標(biāo)準(zhǔn)庫進(jìn)行編碼和構(gòu)建的難度,比起使用 C 或 C++ 來要簡(jiǎn)單太多实愚。另外兼呵,即使不是性能關(guān)鍵部分,我們也應(yīng)該盡量考慮在沒有必要時(shí)減少使用 NSObject 和它的子類腊敲。如果沒有動(dòng)態(tài)特性的需求的話击喂,保持在 Swift 基本類型中會(huì)讓我們得到更多的性能提升。

更多文章

CocoaPods開源庫的搭建
CocoaPods搭建私有庫
CocoaPods搭建私有庫遇到問題
CocoaPods私有庫的升級(jí)維護(hù)
SKStoreReviewController之程序內(nèi)評(píng)價(jià)
App應(yīng)用程序圖標(biāo)的動(dòng)態(tài)更換
開源框架 MGJRouter_Swift
iOS的MVP設(shè)計(jì)模式
iOS插件化
iOS FMDB的使用
Swift之ReactiveSwift
OC之ReactiveCocoa
OC之ReactiveCocoa進(jìn)階
iOS 性能考慮

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碰辅,一起剝皮案震驚了整個(gè)濱河市懂昂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌没宾,老刑警劉巖凌彬,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異循衰,居然都是意外死亡铲敛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門会钝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伐蒋,“玉大人,你說我怎么就攤上這事迁酸∠扔悖” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵奸鬓,是天一觀的道長焙畔。 經(jīng)常有香客問我,道長串远,這世上最難降的妖魔是什么宏多? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任儿惫,我火速辦了婚禮,結(jié)果婚禮上绷落,老公的妹妹穿的比我還像新娘姥闪。我一直安慰自己,他們只是感情好砌烁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著催式,像睡著了一般函喉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荣月,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天管呵,我揣著相機(jī)與錄音,去河邊找鬼哺窄。 笑死捐下,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萌业。 我是一名探鬼主播坷襟,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼生年!你這毒婦竟也來了婴程?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤抱婉,失蹤者是張志新(化名)和其女友劉穎档叔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸绩,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衙四,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了患亿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传蹈。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窍育,靈堂內(nèi)的尸體忽然破棺而出卡睦,到底是詐尸還是另有隱情,我是刑警寧澤漱抓,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布表锻,位于F島的核電站,受9級(jí)特大地震影響乞娄,放射性物質(zhì)發(fā)生泄漏瞬逊。R本人自食惡果不足惜显歧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望确镊。 院中可真熱鬧士骤,春花似錦、人聲如沸蕾域。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨巷。三九已至巨缘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間采呐,已是汗流浹背若锁。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斧吐,地道東北人又固。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像煤率,于是被迫代替她去往敵國和親仰冠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫涕侈、插件沪停、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,117評(píng)論 4 61
  • 我好像并不那么愛笑木张, 都說微笑是世界上最美的表情! 所以我們應(yīng)該努力把開心當(dāng)成一種習(xí)慣端三! 學(xué)會(huì)開心舷礼,才是最精彩的艷...
    彡十不凡閱讀 153評(píng)論 0 0
  • 文丨有財(cái)不楠 今天大盤總體還不錯(cuò)妻献,雖然是超跌縮量反彈,但畢竟也是反彈团赁,主要是中小板的回升育拨,統(tǒng)計(jì)了一下,有64支股票...
    有財(cái)不楠閱讀 196評(píng)論 0 0
  • 你知道大地在秋天 沉思默想些什么欢摄? (何不頒個(gè)獎(jiǎng)牌給 第一片轉(zhuǎn)黃的樹葉熬丧?
    與馬薛薛閱讀 159評(píng)論 0 0