大家肯定也都或多或少的寫過一些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性能剖析器,您可以創建構建場景並多次運行這些場景,以防止結果出現過大差異,並確保結果的可重現性。
基準化分析的部分項目設置配置包括:
比如我們需要對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性能
以下數據來自在Gradle CI上運行的性能測試。這些測試運行在一個包含大量subProject的大型項目中,並且它們在 Groovy 和 Kotlin DSL 上運行以進行比較。
可以看出,Groovy腳本在性能上還是有一定優勢
可以看出,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性能
可以看出,針對Gradle 7.4版本,KTS的編譯性能有一定改善,性能差距減少到了1.5倍左右
總結總得來說,KTS在可讀性,易用性,編譯時檢查與IDE支持等方面比起Groovy都有巨大的優勢,但是在性能方面存在一定劣勢,具體如下:
由上可知,KTS目前的優缺點都非常明顯,在易用性上非常突出,在性能方面有一定劣勢,Gradle官方也一直在優化中,讀者可以根據自己的項目情況決定是否將構建配置從 Groovy 遷移到 KTS
參考資料The Kotlin and Groovy DSLs should have similar performance characteristics