Skip to content

改善編譯時間的小技巧

Kotlin/Native 編譯器不斷收到改進其效能的更新。透過使用最新的 Kotlin/Native 編譯器和正確配置的建置環境,您可以顯著縮短具有 Kotlin/Native 目標的專案編譯時間。

請閱讀以下關於如何加速 Kotlin/Native 編譯過程的小技巧。

一般建議

使用最新版本的 Kotlin

透過這種方式,您始終可以獲得最新的效能改善。最新的 Kotlin 版本是 2.3.0。

避免建立巨大的類別

嘗試避免建立在執行期間需要很長時間來編譯和載入的巨大類別。

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

編譯專案時,Kotlin/Native 會下載所需的組件,並將其部分工作結果快取到 $USER_HOME/.konan 目錄中。編譯器會在後續編譯中使用此目錄,從而縮短完成時間。

在容器(例如 Docker)中或使用持續整合系統進行建置時,編譯器可能必須為每次建置從頭開始建立 ~/.konan 目錄。為了避免此步驟,請配置您的環境以在建置之間保留 ~/.konan。例如,使用 konan.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 分發。

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

僅針對必要的目標進行建置

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

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

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

不要建置不必要的 release 二進位檔

Kotlin/Native 支援兩種建置模式:debug 和 release。Release 模式經過高度優化,這需要很多時間:編譯 release 二進位檔所花費的時間比 debug 二進位檔多出一個數量級。

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

Release 二進位檔是使用 linkRelease* Gradle 任務建置的。您可以透過使用 --scan 選項執行 Gradle 建置,在建置日誌或 Gradle 建置掃描 中檢查它們。

Experimental

縮小 release 二進位檔的大小

要縮小 release 二進位檔的大小並改善建置時間,請嘗試 啟用二進位檔選項 smallBinary

這會有效地將 -Oz 設定為編譯器在 LLVM 編譯階段的預設優化引數。此選項仍處於 實驗階段,且在某些情況下可能會影響執行時間效能。

不要停用 Gradle daemon

除非有充分的理由,否則請勿停用 Gradle daemon。預設情況下, Kotlin/Native 會從 Gradle daemon 執行。啟用後,將使用同一個 JVM 程序,無需為每次編譯都進行預熱。

不要使用傳遞性匯出 (transitive export)

在許多情況下,使用 transitiveExport = true 會停用無效程式碼刪除,因此編譯器必須處理大量未使用的程式碼。這會增加編譯時間。相反地,應明確使用 export 方法來匯出所需的專案和相依性。

不要過度匯出模組

嘗試避免不必要的 模組匯出。每個匯出的模組都會對編譯時間和二進位檔大小產生負面影響。

使用 Gradle 建置快取

啟用 Gradle 建置快取 功能:

  • 本機建置快取:對於本機快取,請將 org.gradle.caching=true 新增到您的 gradle.properties 檔案中,或在命令列中使用 --build-cache 選項執行建置。
  • 遠端建置快取:了解如何為持續整合環境 配置遠端建置快取

使用 Gradle 設定快取

Gradle 設定快取 透過快取設定階段的結果來提高建置效能。它還允許在單個專案中並行執行獨立任務,並隱含地啟用 org.gradle.parallel 屬性,允許不同專案之間的任務 並行執行

要使用 Gradle 設定快取,請將 org.gradle.configuration-cache=true 屬性新增到您的 gradle.properties 檔案中。

設定快取還允許並行執行 link* 任務,這可能會使機器負擔沉重,特別是在具有大量 CPU 核心的情況下。此問題將在 KT-70915 中修復。

啟用先前停用的功能

有一些 Kotlin/Native 選項會停用 Gradle daemon 和編譯器快取:

  • kotlin.native.disableCompilerDaemon=true
  • Gradle 建置檔案中 binaries {} 區塊內的 disableNativeCache DSL。

如果您以前在使用這些功能時遇到問題並將這些行新增到 gradle.properties 檔案或 Gradle 建置檔案中,請將其移除並檢查建置是否成功完成。這些屬性可能是以前為了避開已修復的問題而新增的。

嘗試 klib 構件的增量編譯

使用增量編譯,如果專案模組產生的 klib 構件僅有一部分發生變更,則只有該 klib 的一部分會被進一步重新編譯為二進位檔。

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

Windows 設定

Windows 安全性可能會降低 Kotlin/Native 編譯器的速度。您可以透過將 .konan 目錄(預設位於 %\USERPROFILE%)新增到 Windows 安全性排除項中來避免這種情況。了解如何 將排除項新增至 Windows 安全性

Advanced

LLVM 設定

如果上述技巧無助於改善編譯時間,請考慮 自訂 LLVM 後端