Skip to content

改善編譯時間的提示

Kotlin/Native 編譯器不斷接收更新,以提升其效能。藉由最新的 Kotlin/Native 編譯器和正確配置的建置環境,您可以顯著改善使用 Kotlin/Native 目標的專案之編譯時間。

請繼續閱讀我們關於如何加速 Kotlin/Native 編譯過程的提示。

一般建議

使用最新版本的 Kotlin

這樣,您將始終獲得最新的效能改進。最新的 Kotlin 版本為 2.2.20。

避免建立龐大的類別

盡量避免建立在編譯和執行載入時需要很長時間的龐大類別。

在建置之間保留已下載和快取的元件

在編譯專案時,Kotlin/Native 會下載所需的元件,並將其部分工作結果快取到 $USER_HOME/.konan 目錄。編譯器使用此目錄進行後續編譯,使其花費較少時間完成。

在容器(例如 Docker)或持續整合系統中建置時,編譯器可能必須為每次建置從頭建立 ~/.konan 目錄。為避免此步驟,請配置您的環境以在建置之間保留 ~/.konan。例如,使用 kotlin.data.dir Gradle 屬性重新定義其位置。

或者,您可以使用 -Xkonan-data-dir 編譯器選項,透過 cinteropkonanc 工具配置您自訂的目錄路徑。

Gradle 配置

由於需要下載依賴項、建置快取並執行額外步驟,使用 Gradle 的首次編譯通常比後續編譯花費更多時間。您應至少建置您的專案兩次,以獲得實際編譯時間的準確讀數。

以下是關於如何配置 Gradle 以獲得更好編譯效能的一些建議。

增加 Gradle 堆積大小

要增加 Gradle 堆積大小,請將 org.gradle.jvmargs=-Xmx3g 加入您的 gradle.properties 檔案中。

如果您使用 平行建置,您可能需要使用 org.gradle.workers.max 屬性或 --max-workers 命令列選項來選擇合適的工作者數量。預設值為 CPU 處理器數量。

僅建置必要的二進位檔

除非您確實需要,否則不要執行會建置整個專案的 Gradle 任務,例如 buildassemble。這些任務會多次建置相同的程式碼,從而增加編譯時間。在典型情況下,例如從 IntelliJ IDEA 執行測試或從 Xcode 啟動應用程式時,Kotlin 工具會避免執行不必要的任務。

如果您有非典型情況或建置配置,您可能需要自行選擇任務:

  • linkDebug*。在開發期間執行您的程式碼時,您通常只需要一個二進位檔,因此執行對應的 linkDebug* 任務應該就足夠了。

  • embedAndSignAppleFrameworkForXcode。由於 iOS 模擬器和裝置具有不同的處理器架構,因此將 Kotlin/Native 二進位檔作為通用 (fat) 框架發布是一種常見方法。

    然而,在本地開發期間,僅為您使用的平台建置 .framework 檔案會更快。要建置特定平台框架,請使用 embedAndSignAppleFrameworkForXcode 任務。

僅為必要的目標建置

與上述建議類似,不要一次為所有原生平台建置二進位檔。例如,編譯 XCFramework(使用 *XCFramework 任務)會為所有目標建置相同的程式碼,這會比為單一目標建置花費成比例更多的時間。

如果您的設定確實需要 XCFramework,您可以減少目標數量。例如,如果您不在基於 Intel 的 Mac 上的 iOS 模擬器上執行此專案,則不需要 iosX64

針對不同目標的二進位檔是透過 linkDebug*$TargetlinkRelease*$Target Gradle 任務建置的。您可以透過執行帶有 --scan 選項的 Gradle 建置來在建置日誌或 Gradle 建置掃描中查找已執行的任務。

不要建置不必要的發行二進位檔

Kotlin/Native 支援兩種建置模式:偵錯和發行。發行模式經過高度最佳化,這會花費大量時間:編譯發行二進位檔所花費的時間比偵錯二進位檔高一個數量級。

除了實際發行之外,在典型的開發週期中,所有這些最佳化可能是不必要的。如果您在開發過程中使用了名稱中包含 Release 的任務,請考慮將其替換為 Debug。同樣地,您可以執行 assembleSharedDebugXCFramework,而不是執行 assembleXCFramework

發行二進位檔是透過 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 檔案中。

配置快取還支援平行執行 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 構件的增量編譯

透過增量編譯,如果專案模組產生的 klib 構件只有一部分發生變化,那麼只有 klib 的一部分會被進一步重新編譯為二進位檔。

此功能為實驗性。要啟用它,請將 kotlin.incremental.native=true 選項加入您的 gradle.properties 檔案中。如果您遇到任何問題,請在 YouTrack 中建立一個議題。

Windows 配置

Windows 安全性可能會減慢 Kotlin/Native 編譯器的速度。您可以透過將預設位於 %\USERPROFILE%.konan 目錄加入 Windows 安全性排除項來避免此問題。了解如何將排除項加入 Windows 安全性

Advanced

LLVM 配置

如果上述提示未能改善編譯時間,請考慮自訂 LLVM 後端