提升編譯時間的秘訣
Kotlin/Native 編譯器持續接收更新,以改善其效能。透過最新的 Kotlin/Native 編譯器和正確配置的建置環境,您可以顯著改善專案中 Kotlin/Native 目標的編譯時間。
請繼續閱讀我們的秘訣,了解如何加快 Kotlin/Native 編譯過程。
一般建議
使用最新版本的 Kotlin
這樣,您總能獲得最新的效能改進。最新的 Kotlin 版本為 2.1.21。
避免建立龐大類別
盡量避免建立在執行時需要很長時間才能編譯和載入的龐大類別。
在建置之間保留下載和快取元件
編譯專案時,Kotlin/Native 會下載所需的元件,並將部分工作結果快取到 $USER_HOME/.konan
目錄中。編譯器使用此目錄進行後續編譯,使其完成時間縮短。
在使用容器 (例如 Docker) 或持續整合系統進行建置時,編譯器可能必須為每次建置從頭開始建立 ~/.konan
目錄。為避免此步驟,請配置您的環境,以在建置之間保留 ~/.konan
。例如,使用 kotlin.data.dir
Gradle 屬性重新定義其位置。
或者,您可以透過 cinterop
和 konanc
工具使用 -Xkonan-data-dir
編譯器選項來配置您的自訂目錄路徑。
Gradle 配置
由於需要下載相依性、建置快取並執行額外步驟,Gradle 的首次編譯通常比後續編譯花費更多時間。您應該至少建置專案兩次,才能準確衡量實際的編譯時間。
以下是配置 Gradle 以獲得更好編譯效能的一些建議。
增加 Gradle 堆積大小
若要增加 Gradle 堆積大小,請將 org.gradle.jvmargs=-Xmx3g
加入您的 gradle.properties
檔案。
如果您使用平行建置,您可能需要使用 org.gradle.workers.max
屬性或 --max-workers
命令列選項來選擇正確的工作者數量。預設值是 CPU 處理器數量。
僅建置必要的二進位檔
除非您確實需要,否則不要執行會建置整個專案的 Gradle 任務,例如 build
或 assemble
。這些任務會多次建置相同的程式碼,從而增加編譯時間。在典型情況下,例如從 IntelliJ IDEA 執行測試或從 Xcode 啟動應用程式,Kotlin 工具會避免執行不必要的任務。
如果您遇到非典型情況或建置配置,您可能需要自己選擇任務:
linkDebug*
。要在開發期間執行您的程式碼,您通常只需要一個二進位檔,因此執行相應的linkDebug*
任務就足夠了。embedAndSignAppleFrameworkForXcode
。由於 iOS 模擬器和裝置具有不同的處理器架構,因此將 Kotlin/Native 二進位檔作為通用 (fat) 框架分發是一種常見做法。然而,在本地開發期間,僅為您正在使用的平台建置
.framework
檔案會更快。若要建置特定平台框架,請使用 embedAndSignAppleFrameworkForXcode 任務。
僅建置必要目標
與上述建議類似,不要一次為所有原生平台建置二進位檔。例如,編譯 XCFramework (使用 *XCFramework
任務) 會為所有目標建置相同的程式碼,這比為單一目標建置花費的時間按比例更多。
如果您的設定確實需要 XCFrameworks,您可以減少目標數量。例如,如果您不在基於 Intel 的 Mac 上於 iOS 模擬器上執行此專案,則不需要 iosX64
。
TIP
針對不同目標的二進位檔是透過 linkDebug*$Target
和 linkRelease*$Target
Gradle 任務建置的。
您可以在建置日誌或透過執行帶有 --scan
選項的 Gradle 建置的 Gradle 建置掃描 中查看已執行的任務。
不要建置不必要的發布二進位檔
Kotlin/Native 支援兩種建置模式:除錯和發布。發布版本高度優化,這需要大量時間:發布二進位檔的編譯時間比除錯二進位檔的編譯時間多一個數量級。
除了實際發布之外,在典型開發週期中,所有這些優化可能都是不必要的。如果您在開發過程中使用了名稱中帶有 Release
的任務,請考慮將其替換為 Debug
。同樣地,除了執行 assembleXCFramework
,您可以執行 assembleSharedDebugXCFramework
,例如。
TIP
發布二進位檔是透過 linkRelease*
Gradle 任務建置的。您可以在建置日誌或透過執行帶有 --scan
選項的 Gradle 建置的 Gradle 建置掃描 中查看它們。
不要停用 Gradle 精靈
沒有充分理由,不要停用 Gradle 精靈。預設情況下,Kotlin/Native 從 Gradle 精靈執行。當它啟用時,使用相同的 JVM 程序,並且不需要為每次編譯預熱它。
不要使用傳遞性匯出
使用 transitiveExport = true
在許多情況下會停用無用代碼消除,因此編譯器必須處理大量未使用的代碼。這會增加編譯時間。相反,請明確使用 export
方法來匯出所需的專案和相依性。
不要過度匯出模組
盡量避免不必要的模組匯出。每個匯出的模組都會對編譯時間和二進位檔大小產生負面影響。
使用 Gradle 建置快取
啟用 Gradle 建置快取 功能:
- 本地建置快取。對於本地快取,請將
org.gradle.caching=true
加入您的gradle.properties
檔案,或在命令列中執行帶有--build-cache
選項的建置。 - 遠端建置快取。了解如何配置遠端建置快取以用於持續整合環境。
使用 Gradle 配置快取
若要使用 Gradle 配置快取,請將 org.gradle.configuration-cache=true
加入您的 gradle.properties
檔案。
NOTE
配置快取還允許平行執行 link*
任務,這可能會嚴重負載機器,特別是當 CPU 核心數很多時。此問題將在 KT-70915 中修復。
啟用先前停用的功能
有一些 Kotlin/Native 屬性會停用 Gradle 精靈和編譯器快取:
kotlin.native.disableCompilerDaemon=true
kotlin.native.cacheKind=none
kotlin.native.cacheKind.$target=none
,其中$target
是 Kotlin/Native 編譯目標,例如iosSimulatorArm64
。
如果您之前在這些功能方面遇到問題,並將這些行加入您的 gradle.properties
檔案或 Gradle 參數中,請將其刪除並檢查建置是否成功完成。這些屬性可能是在以前為解決已修復的問題而添加的。
嘗試 KLib Artifact 的增量編譯
透過增量編譯,如果專案模組產生的 klib
artifact 只有部分變更,則只有 klib
的部分會進一步重新編譯成二進位檔。
此功能為實驗性。若要啟用它,請將 kotlin.incremental.native=true
選項加入您的 gradle.properties
檔案。如果您遇到任何問題,請在 YouTrack 中建立問題。
Windows 配置
Windows 安全性可能會減慢 Kotlin/Native 編譯器。您可以透過將預設位於 %\USERPROFILE%
的 .konan
目錄加入 Windows 安全性排除項目來避免此問題。了解如何將排除項目加入 Windows 安全性。