原文連結
之前我司每個 Java 應用部署到預發都要等待漫長的編譯打包時間,非常地痛苦!大項目編譯時間常常達到接近 10 分鐘,生命短暫啊,人生有多少個 10 分鐘可以等待,于是我們的效能團隊針對編譯作了一些優化,提速非常明顯,對某個應用的測試來看,編譯時間從 160 s 縮短到了 50 s 左右,提升近 70%,大家紛紛點贊,那麼效能團隊做了哪些措施來讓編譯速度提升這麼明顯呢?
首先要說的是我們用的 Gradle 來作為我們的建構工具,是以主要是針對 Gradle 的指令來作了一些優化。
1、修改 gradle build 的參數
- 使用 --build-cache
什麼是 build cache(建構緩存),在 Gradle 中,每一個待編譯的工程叫 Project,每一個 Project 在建構時都包含一系列的 task。

每個 task 的輸入都可以作為下一個 task 的輸出,build cache 做的事就是把可以緩存(注:并不是所有的 task 輸出都能緩存)的 task 輸出都緩存住,這樣在建構過程中,如果發現這個 task 的輸入不變,就沒必要重新執行任務了,直接從 task ouput 緩存裡拿即可,如下圖示,Build 2 的建構輸入直接從 Build Cache 中拿,這樣 Build 1 就不用建構了。
效果怎麼樣呢,看下圖,下面圖分别顯示了 Gradle 持續內建時使用建構緩存和不使用建構緩存兩種情況下的聚合的建構時間,可以看到使用了 cache 的 Gradle 建構速度明顯快于不使用 cache 的情況。
更騷的是這個 Buiid Cache 支援分布式的,可以統一把這些 cache 丢到一台機器上,本地機器要編譯時統一去這台機器拉 cache,這樣如果我們切換分支時執行建構也能用 Build Cache 來加快建構速度。
--build-cache 的具有使用需要注意一些事項,比如得 Gradle 4.3 以上才有效,建議大家直接去官網查檢視。
- 增加 --parallel 參數
并行執行在多項目編譯的項目中能有效提升編譯的速度,但是并行執行的前提是每個項目已經被子產品化,每個項目之間沒有耦合。
- 移除 --refresh-dependencies 參數
原來 gradle build 有加這個參數,這個參數會忽略緩存,強制重新下載下傳,顯然是編譯的瓶頸。
2、任務并行
原來 Jenkins 中執行 Gradle 編譯任務,每個 Task 是串行執行的,總編譯耗時是每個任務執行時間的總和。
現在把它改成了并行的
顯然并行執行會快得多。
3、将大項目工程中的常用代碼抽成 jar 包
對于業務方來說,采用這種方式也是提升編譯速度的有效手段 ,将大量代碼抽成 jar 包,意味着它們本身就是位元組碼了,在 gradle build 時就不用編譯啦。自然能提升整個工程的編譯打包時間。
來源 | 碼海
作者 | 碼海