close
前言

大家肯定也都或多或少的寫過一些Groovy代碼,但由於不支持代碼提示及編譯時檢查,使用Groovy開發的體驗並不太好Android Gradle插件4.0之後支持在Gradle構建配置中使用Kotlin 腳本 (KTS),用於替代 Groovy(過去在 Gradle 配置文件中使用的編程語言)。KTS 比 Groovy 更適合用於編寫 Gradle 腳本,因為採用 Kotlin 編寫的代碼可讀性更高,並且 Kotlin 提供了更好的編譯時檢查和 IDE 支持。

但是文檔中也提到了,雖然與 Groovy 相比,KTS 當前能更好地在 Android Studio 的代碼編輯器中集成,但採用 KTS 的構建速度往往比採用 Groovy 慢,因此在遷移到 KTS 時應考慮構建性能。

那麼我們今天就來看下相比Groovy,KTS性能到底怎麼樣?為大家決定是否遷移到KTS提供一定的參考

KTS性能分析 性能分析工具

要分析KTS的性能,我們首先需要穩定的測量編譯的時間,編譯速度可能受build cache等多種因素的影響,所以很難測量kts插件對性能的影響到底有多大

我們可以使用Gradle 性能剖析器來準確測量性能,這是一款用於收集 Gradle 構建的性能分析和基準化分析信息的工具。藉助 Gradle性能剖析器,您可以創建構建場景並多次運行這些場景,以防止結果出現過大差異,並確保結果的可重現性。

基準化分析的部分項目設置配置包括:

插件版本
Gradle 版本
JVM 設置(堆大小、永久代大小、垃圾回收等)
Gradle 工作器數量 (org.gradle.workers.max)
按插件選項進一步優化性能

比如我們需要對clean build進行基準化分析,您可以創建一個gradle-profiler執行的場景:

#<root-project>/scenarios.txtclean_build{tasks=[":app:assembleDebug"]cleanup-tasks=["clean"]}

如需運行此場景,請使用以下命令:

gradle-profiler--benchmark--project-dir<root-project>--scenario-filescenarios.txt

通過以上命令,就可以多次運行clean build,並生成clean build性能報告。除了clan build,gradle-profiler還可以針對增量編譯,不同的 Gradle 插件版本,以及不同的內存/CPU 等執行性能分析。通過gradle-profile命令,可以創建構建場景並多次運行,可以防止結果出現過大差異,並確保結果的可重現性,以幫助我們更好地分析性能。關於gradle-profile的具體使用,可以參考文檔:分析構建性能

Gradle 6.8 版本性能分析

針對Gradle 6.8版本,我們從以下4個用例來分析KTS性能

首次運行(即清除所有build cache)
buildSrc abi 更改(支持的abi發生變化,可以理解為大多數緩存失效,大部分代碼需要重新編譯)
buildSrc 非 abi 更改(即buildSrc中的普通修改)
無改動

以下數據來自在Gradle CI上運行的性能測試。這些測試運行在一個包含大量subProject的大型項目中,並且它們在 Groovy 和 Kotlin DSL 上運行以進行比較。

Use caseGroovyKotlinDifferencesFirst use🟢 33.5s🔴 76.2sGroovy DSL is 2.2x fasterbuildSrc abi change🟢 13.2s🔴 42.3sGroovy DSL is 3.2x fasterbuildSrc non-abi change🔴 13s🟢 5.2sKotlin DSL is 2.5x fasterNothing changes🔵 1.7s🔵 1.8sSimilar performance

可以看出,Groovy腳本在性能上還是有一定優勢

在首次運行時,Groovy DSL比KTS快2.2倍
在buildSrc abi更改時,Groovy DSL比KTS快3.2倍
在buildSrc非abi更改時,KTS比Groovy快2.5倍
在代碼沒有發生更改時,兩者性能類似

可以看出,KTS只有在buildSrc非abi更改時有性能優勢,這是因為buildSrc中的groovy的更改會導致整個項目過時,導致項目重新編譯而buildSrc中的kts修改可以跳過未受影響的構建腳本文件的編譯,因此當修改buildsrc時,kts編譯會遠比groovy插件要快

以上數據來源於:https://builds.gradle.org/buildConfiguration/Gradle_Master_Check_PerformanceTestSlowLinux_Trigger?branch=master&buildTypeTab=overview&mode=builds,可以使用訪客模式登錄查看

Gradle 7.4 版本性能分析

針對Gradle 7.4版本,我們通過以下3個用例來分析KTS性能

首次運行(即清除所有build cache)
buildSrc abi 更改(支持的abi發生變化,可以理解為大多數緩存失效,大部分代碼需要重新編譯)
buildSrc 非 abi 更改(即buildSrc中的普通修改)
Use CaseGroovyKotlinDifferenceFirst use🟢 38.855s🔴 63.54sGroovy DSL is 1.6x fasterbuildSrc abi change🟢 25.307🔴 35.014sGroovy DSL is 1.4x fasterbuildSrc non-abi change🔴 24.526s🟢 4.732sKotlin DSL is 5x faster

可以看出,針對Gradle 7.4版本,KTS的編譯性能有一定改善,性能差距減少到了1.5倍左右

總結

總得來說,KTS在可讀性,易用性,編譯時檢查與IDE支持等方面比起Groovy都有巨大的優勢,但是在性能方面存在一定劣勢,具體如下:

針對Gradle 6.8版本,如果緩存大部分失效或者沒有緩存,Groovy DSL比KTS快2到3倍
Gradle 7.4版本KTS性能有一定改善,如果緩存大部分失效或者沒有緩存,Groovy DSL比KTS快1.5倍左右。
當buildSrc中發生非abi更改時,kts腳本編譯比Groovy DSL快4到5倍,這是因為buildSrc中的kts可以跳過未受影響的構建腳本的編譯,而groovy暫不支持
當項目沒有發生更改時,KTS與Groovy DSL的編譯速度相差不大

由上可知,KTS目前的優缺點都非常明顯,在易用性上非常突出,在性能方面有一定劣勢,Gradle官方也一直在優化中,讀者可以根據自己的項目情況決定是否將構建配置從 Groovy 遷移到 KTS

參考資料

The Kotlin and Groovy DSLs should have similar performance characteristics

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()