Skip to content

コンパイル時間短縮のヒント

Kotlin/Nativeコンパイラは、そのパフォーマンスを向上させるための更新を常に受けています。最新のKotlin/Nativeコンパイラと適切に設定されたビルド環境があれば、Kotlin/Nativeターゲットを持つプロジェクトのコンパイル時間を大幅に改善できます。

Kotlin/Nativeのコンパイルプロセスを高速化するためのヒントを続けてお読みください。

一般的な推奨事項

最新バージョンのKotlinを使用する

これにより、常に最新のパフォーマンス改善が得られます。最新のKotlinバージョンは 2.2.10 です。

巨大なクラスの作成を避ける

コンパイルに時間がかかり、実行時にロードされる巨大なクラスの作成は避けるようにしてください。

ビルド間でダウンロード済みおよびキャッシュされたコンポーネントを保持する

プロジェクトをコンパイルする際、Kotlin/Nativeは必要なコンポーネントをダウンロードし、その作業結果の一部を$USER_HOME/.konanディレクトリにキャッシュします。コンパイラはこのディレクトリを以降のコンパイルに使用し、完了にかかる時間を短縮します。

コンテナ(Dockerなど)または継続的インテグレーションシステムでビルドを行う場合、コンパイラはビルドごとに~/.konanディレクトリをゼロから作成する必要があるかもしれません。この手順を避けるには、ビルド間で~/.konanを保持するように環境を設定してください。たとえば、kotlin.data.dir Gradleプロパティを使用してその場所を再定義します。

あるいは、-Xkonan-data-dirコンパイラオプションを使用して、cinteropおよびkonancツール経由でディレクトリへのカスタムパスを設定できます。

Gradle設定

Gradleでの最初のコンパイルは、依存関係のダウンロード、キャッシュの構築、および追加の手順の実行が必要なため、通常は後続のコンパイルよりも時間がかかります。実際のコンパイル時間を正確に把握するには、プロジェクトを少なくとも2回ビルドする必要があります。

以下に、コンパイルパフォーマンスを向上させるためのGradle設定の推奨事項を示します。

Gradleヒープサイズの増加

Gradleヒープサイズを増やすには、gradle.propertiesファイルにorg.gradle.jvmargs=-Xmx3gを追加します。

並列ビルドを使用する場合、org.gradle.workers.maxプロパティまたは--max-workersコマンドラインオプションを使用して適切なワーカー数を選択する必要があるかもしれません。デフォルト値はCPUプロセッサの数です。

必要なバイナリのみをビルドする

本当に必要な場合を除き、buildassembleなど、プロジェクト全体をビルドするGradleタスクを実行しないでください。これらのタスクは同じコードを複数回ビルドするため、コンパイル時間が増加します。IntelliJ IDEAからテストを実行したり、Xcodeからアプリを起動したりするような一般的なケースでは、Kotlinツールは不要なタスクの実行を回避します。

一般的でないケースやビルド設定の場合、タスクを自分で選択する必要があるかもしれません。

  • linkDebug*。開発中にコードを実行する場合、通常は1つのバイナリのみが必要なため、対応するlinkDebug*タスクを実行するだけで十分なはずです。
  • embedAndSignAppleFrameworkForXcode。iOSシミュレータとデバイスは異なるプロセッサアーキテクチャを持っているため、Kotlin/Nativeバイナリをユニバーサル(fat)フレームワークとして配布するのが一般的なアプローチです。 ただし、ローカル開発中は、使用しているプラットフォーム専用の.frameworkファイルをビルドする方が高速です。プラットフォーム固有のフレームワークをビルドするには、embedAndSignAppleFrameworkForXcodeタスクを使用します。

必要なターゲットのみをビルドする

上記の推奨事項と同様に、すべてのネイティブプラットフォーム用のバイナリを一度にビルドしないでください。たとえば、XCFrameworkをコンパイルする(*XCFrameworkタスクを使用する)と、すべてのターゲットに対して同じコードがビルドされ、単一ターゲットのビルドよりも比例して多くの時間がかかります。

もしセットアップにXCFrameworkが必要な場合でも、ターゲットの数を減らすことができます。たとえば、IntelベースのMac上のiOSシミュレータでこのプロジェクトを実行しない場合、iosX64は必要ありません。

異なるターゲットのバイナリは、linkDebug*$Target および linkRelease*$Target Gradleタスクでビルドされます。実行されたタスクは、ビルドログ、または--scanオプションを付けてGradleビルドを実行することでGradleビルドスキャンで確認できます。

不要なリリースバイナリをビルドしない

Kotlin/Nativeは、デバッグモードとリリースモードの2つのビルドモードをサポートしています。リリースは高度に最適化されており、これには多くの時間がかかります。リリースバイナリのコンパイルは、デバッグバイナリよりも桁違いに時間がかかります。

実際のリリースを除けば、これらの最適化はすべて、通常の開発サイクルでは不要な場合があります。開発プロセス中に名前にReleaseを含むタスクを使用している場合は、Debugに置き換えることを検討してください。同様に、assembleXCFrameworkを実行する代わりに、たとえばassembleSharedDebugXCFrameworkを実行できます。

リリースバイナリはlinkRelease* Gradleタスクでビルドされます。ビルドログ、または--scanオプションを付けてGradleビルドを実行することでGradleビルドスキャンでそれらを確認できます。

Gradleデーモンを無効にしない

正当な理由がない限り、Gradleデーモンを無効にしないでください。デフォルトでは、Kotlin/NativeはGradleデーモンから実行されます。有効になっている場合、同じJVMプロセスが使用され、コンパイルごとにウォームアップする必要はありません。

推移的エクスポートを使用しない

transitiveExport = trueを使用すると、多くの場合、デッドコードエリミネーションが無効になり、コンパイラは大量の未使用コードを処理する必要があります。これによりコンパイル時間が増加します。代わりに、必要なプロジェクトと依存関係をエクスポートするには、exportメソッドを明示的に使用してください。

モジュールを過度にエクスポートしない

不要なモジュールエクスポートは避けるようにしてください。エクスポートされた各モジュールは、コンパイル時間とバイナリサイズに悪影響を及ぼします。

Gradleビルドキャッシュを使用する

Gradleのビルドキャッシュ機能を有効にします。

  • ローカルビルドキャッシュ。ローカルキャッシュの場合、gradle.propertiesファイルにorg.gradle.caching=trueを追加するか、コマンドラインで--build-cacheオプションを付けてビルドを実行します。
  • リモートビルドキャッシュ。継続的インテグレーション環境向けにリモートビルドキャッシュを設定する方法を学習してください。

Gradleコンフィギュレーションキャッシュを使用する

Gradleのコンフィギュレーションキャッシュを使用するには、gradle.propertiesファイルにorg.gradle.configuration-cache=trueを追加します。

コンフィギュレーションキャッシュは、link*タスクの並列実行も可能にします。これにより、特に多くのCPUコアを持つマシンで負荷が大きくなる可能性があります。この問題はKT-70915で修正される予定です。

以前に無効にした機能を有効にする

Gradleデーモンとコンパイラキャッシュを無効にするKotlin/Nativeプロパティがあります。

kotlin.native.disableCompilerDaemon=true
kotlin.native.cacheKind=none
kotlin.native.cacheKind.$target=none

ここで$targetはKotlin/Nativeのコンパイルターゲットです(例: iosSimulatorArm64)。

以前にこれらの機能で問題があり、gradle.propertiesファイルまたはGradle引数にこれらの行を追加した場合は、それらを削除してビルドが正常に完了するかどうかを確認してください。これらのプロパティは、以前にすでに修正された問題を回避するために追加された可能性があります。

klibアーティファクトのインクリメンタルコンパイルを試す

インクリメンタルコンパイルでは、プロジェクトモジュールによって生成されたklibアーティファクトの一部のみが変更された場合、klibの一部だけがバイナリに再コンパイルされます。

この機能はExperimentalです。これを有効にするには、gradle.propertiesファイルにkotlin.incremental.native=trueオプションを追加します。問題が発生した場合は、YouTrackでissueを作成してください。

Windows設定

WindowsセキュリティはKotlin/Nativeコンパイラの動作を遅くする可能性があります。これを回避するには、デフォルトで%\USERPROFILE%にある.konanディレクトリをWindowsセキュリティの除外に追加します。Windowsセキュリティに除外を追加する方法を学習してください。

Advanced

LLVM設定

上記のヒントがコンパイル時間の改善に役立たなかった場合は、LLVMバックエンドのカスタマイズを検討してください。