前言
因為每次打包時間有點長(9min左右)蕾额,組里要求進行優(yōu)化早芭,于是就有了ccache這個東東(當然組里的其他同學也進行了其它的優(yōu)化)。
簡單搜下ccache 發(fā)現(xiàn)文章并不多诅蝶,就那么幾篇逼友,然后對比了一下,都很雷同秤涩,感情大家用的少啊司抱!
于是按照上面的配置高興的部到項目里筐眷,跑一下,木有啥問題习柠,就是第一遍編譯速度出奇的慢匀谣,不過第二遍那速度杠杠的照棋。但在后續(xù)的部署過程中遇到到了一系列問題。
磁盤讀寫慢
在部署到CI機器(是一臺Mini 武翎,很老的機械硬盤)之后發(fā)現(xiàn)原本20min左右就跑完了烈炭,現(xiàn)在突然增到45min以上,不合理啊至少不能超過20min 吧宝恶。
帶著這個問題符隙,我觀察了CI機上一次run的過程,發(fā)現(xiàn)一個問題垫毙,CPU 的使用率大部分時間都是維持在10%左右霹疫,只有一小部分是60%~80%,不對啊综芥,我的本本在built 的過程中CPU 的使用率基本都是90%丽蝎,為啥CPU 大部分時間都是在閑著呢?后面我看了下磁盤的IO讀寫膀藐,發(fā)現(xiàn)是滿載荷屠阻,后續(xù)又觀察了幾次都是這個樣子,我測了下磁盤讀寫速度:
time sh -c "dd if=/dev/zero of=/tmp/testfile bs=100k count=1k && sync"
額额各,僅僅只有 40MB/s国觉,我的 15寸MacPro 600MB/s,好吧臊泰,不是一個量級的蛉加。后續(xù) CI 機上就移除了 ccache ,僅在打包機(垃圾桶)上部署缸逃。
模塊間的解耦
在使用ccache 的過程中针饥,拉取同事的代碼后,經(jīng)常會出現(xiàn) Build 時間過長的現(xiàn)象需频,用命令 ccache -s
查看后發(fā)現(xiàn) cache 命中率下降丁眼。于是我分析了 ccache 的log,著重那些 miss 的類昭殉,發(fā)現(xiàn)其引用了相當多的模塊苞七,還有各種交叉的,引用很亂挪丢,組里的同學一改動就會波及到很多類蹂风,而對于那些引用很少的,命中率很高乾蓬。所以模塊間的耦合對 ccache 影響很大惠啄。后續(xù)組里同學們一起進行了模塊的解耦,效果是很顯著的。
PCH
PCH 這個東東簡直就是 ccache 的克星撵渡,所以盡量克制融柬,能不用則不用。我司的項目已經(jīng)移除了 PCH趋距。
ccache 配置
CCACHE_CPP2
這個設(shè)置我關(guān)閉粒氧,感覺這個設(shè)置很浪費時間
CCACHE_HARDLINK
這個設(shè)置也關(guān)閉,沒必要使用壓縮的緩存
其它的配置基本都是和大家搜的博客里一樣了
策略
雖然進行了以上幾個步驟节腐,但 模塊間的解耦
不是立即能夠完成的外盯,需要漫長的過程,有時候 ccache 仍然會大面積 miss 為了防止這樣的情況出現(xiàn)铜跑,我們應該做 一個策略门怪,當使用 ccache 超過某一個時間比如 10min,還沒有完成打包或者編譯 就自動禁掉 ccahce 锅纺,經(jīng)過長時間的測試發(fā)現(xiàn)這個策略很好使掷空,沒有一次超過 30min 的。
總結(jié)
使用 ccache 并不一定就能使你的 Xcode 立即就飛起來囤锉,很可能會摔的更死坦弟,所以項目優(yōu)化是必須的,同時硬件配置也要提升官地,磁盤的IO讀寫越快越好酿傍。