Swift build time

前言

Swift編譯時(shí)間過(guò)長(zhǎng)碴卧,是件難以忍受的事情。你能忍心看著幾行看似簡(jiǎn)單的代碼抖格,慢吞吞的編譯嗎诺苹?╮(╯_╰)╭。下面來(lái)介紹幾種減少編譯時(shí)間的方法雹拄。

查看每個(gè)函數(shù)編譯時(shí)間

若要對(duì)癥下藥收奔,首先要抓住作祟的小鬼。有2種方法滓玖。

1坪哄、在build setting中,設(shè)置Other Swift Flags為-Xfrontend -debug-time-function-bodies势篡。這樣編譯時(shí)清楚的看到每個(gè)函數(shù)的編譯時(shí)間翩肌,找到耗時(shí)較多的地方。

1@2x.png

點(diǎn)擊右邊的展開(kāi)按鈕禁悠,可詳細(xì)查看時(shí)間摧阅。

2.png

2、Xcode plugin绷蹲,https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

方法

明確指明類(lèi)型棒卷,不要讓編譯器去推斷

經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)祝钢,在ViewDidLoad中添加如下代碼比规,build的話,在我的機(jī)器上一直卡著不動(dòng)拦英。原因不明蜒什,不知道是機(jī)器還是xcode問(wèn)題,還是本身就很慢疤估。但是在原文章說(shuō)灾常,耗時(shí)630ms×迥矗總之看起來(lái)是比較耗時(shí)的钞瀑。

let myCompany = [
   "employees": [
        "employee 1": ["attribute": "value"],
        "employee 2": ["attribute": "value"],
        "employee 3": ["attribute": "value"],
        "employee 4": ["attribute": "value"],
        "employee 5": ["attribute": "value"],
        "employee 6": ["attribute": "value"],
        "employee 7": ["attribute": "value"],
        "employee 8": ["attribute": "value"],
        "employee 9": ["attribute": "value"],
        "employee 10": ["attribute": "value"],
        "employee 11": ["attribute": "value"],
        "employee 12": ["attribute": "value"],
        "employee 13": ["attribute": "value"],
        "employee 14": ["attribute": "value"],
        "employee 15": ["attribute": "value"],
        "employee 16": ["attribute": "value"],
        "employee 17": ["attribute": "value"],
        "employee 18": ["attribute": "value"],
        "employee 19": ["attribute": "value"],
        "employee 20": ["attribute": "value"],
    ]
]

3.png

但是將類(lèi)型聲明之后,

let myCompany: Dictionary<String, AnyObject> = ...

ViewDidLoad消耗的時(shí)間立馬降到十幾ms慷荔。

4.png
nil判斷

將nil判斷寫(xiě)成if let方式解包雕什。

class CMExpandingTextField: UITextField {

    func textFieldEditingChanged() {
        invalidateIntrinsicContentSize()
    }
    
    override func intrinsicContentSize() -> CGSize {
        if isFirstResponder(), let text = text {
            let size = text.sizeWithAttributes(typingAttributes)
            // Build time: 5238.3ms
            return CGSize(width: size.width + (rightView?.bounds.width ?? 0) + (leftView?.bounds.width ?? 0) + 22, height: bounds.height)
            
  
             // Build time: 32.4ms
        var padding: CGFloat = 22
        if let rightView = rightView {
         padding += rightView.bounds.width
        }

        if let leftView = leftView {
            padding += leftView.bounds.width
        }

        return CGSizeMake(size.width + padding, bounds.height)
        }
        return super.intrinsicContentSize()
    }
}
array+[]

將array+[data],變成array.append(data)

// Build time: 1250.3ms
let systemOptions = [ 7, 14, 30, -1 ]
let systemNames = (0...2).map{ String(format: localizedFormat, systemOptions[$0]) } + [NSLocalizedString("everything", comment: "")]
// Some code in-between 
labelNames = Array(systemNames[0..<count]) + [systemNames.last!]

// Build time: 25.5ms
let systemOptions = [ 7, 14, 30, -1 ]
var systemNames = systemOptions.dropLast().map{ String(format: localizedFormat, $0) }
systemNames.append(NSLocalizedString("everything", comment: ""))
// Some code in-between
labelNames = Array(systemNames[0..<count])
labelNames.append(systemNames.last!)
三段式判斷 a > b ? a : b
// Build time: 239.0ms
let labelNames = type == 0 ? (1...5).map{type0ToString($0)} : (0...2).map{type1ToString($0)}

// Build time: 16.9ms
var labelNames: [String]
if type == 0 {
    labelNames = (1...5).map{type0ToString($0)}
} else {
    labelNames = (0...2).map{type1ToString($0)}
}
CGFloat-->CGFloat類(lèi)型轉(zhuǎn)換
// Build time: 3431.7 ms
return CGFloat(M_PI) * (CGFloat((hour + hourDelta + CGFloat(minute + minuteDelta) / 60) * 5) - 15) * unit / 180

// Build time: 3.0ms
return CGFloat(M_PI) * ((hour + hourDelta + (minute + minuteDelta) / 60) * 5 - 15) * unit / 180
Round()
// Build time: 1433.7ms
let expansion = a — b — c + round(d * 0.66) + e
// Build time: 34.7ms
let expansion = a — b — c + d * 0.66 + e

總結(jié)

減少編譯時(shí)間歸結(jié)于幾點(diǎn):

1、明確指明類(lèi)型贷岸,而不要讓編譯器去推斷代碼中你所使用的類(lèi)型壹士,這樣會(huì)節(jié)省大部分的時(shí)間。

2偿警、減少讓編譯器懵逼的代碼躏救,盡量寫(xiě)的簡(jiǎn)單,明了螟蒸,不要繞圈子盒使。

Whether or not you have a problem with slow build times, it is still useful to build an understanding of what confuses the compiler. I’m sure you’ll find a few surprises yourself

一句話,要善意的對(duì)待編譯器尿庐,不要整各種來(lái)虐待它~ o( ̄▽?zhuān)?/em>)ブ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忠怖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抄瑟,更是在濱河造成了極大的恐慌凡泣,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皮假,死亡現(xiàn)場(chǎng)離奇詭異鞋拟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)惹资,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)贺纲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人褪测,你說(shuō)我怎么就攤上這事猴誊。” “怎么了侮措?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵懈叹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我分扎,道長(zhǎng)澄成,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任畏吓,我火速辦了婚禮墨状,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菲饼。我一直安慰自己肾砂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布巴粪。 她就那樣靜靜地躺著通今,像睡著了一般粥谬。 火紅的嫁衣襯著肌膚如雪肛根。 梳的紋絲不亂的頭發(fā)上辫塌,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音派哲,去河邊找鬼臼氨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芭届,可吹牛的內(nèi)容都是我干的储矩。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼褂乍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼持隧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起逃片,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屡拨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褥实,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體呀狼,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年损离,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哥艇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡僻澎,死狀恐怖貌踏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窟勃,我是刑警寧澤祖乳,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站拳恋,受9級(jí)特大地震影響凡资,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谬运,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一隙赁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梆暖,春花似錦伞访、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弟灼。三九已至,卻和暖如春冒黑,著一層夾襖步出監(jiān)牢的瞬間田绑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工抡爹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掩驱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓冬竟,卻偏偏與公主長(zhǎng)得像欧穴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泵殴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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