Skip to content

コンパイル時間を改善するためのヒント

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プロパティを使用してその場所を再定義します。

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

Gradleの設定

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

以下は、より良いコンパイルパフォーマンスを実現するためのGradle設定に関するいくつかの推奨事項です。

Gradleヒープサイズの増加

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

並列ビルドを使用する場合、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は必要ありません。

TIP

異なるターゲットのバイナリは、linkDebug*$TargetおよびlinkRelease*$Target Gradleタスクでビルドされます。

実行されたタスクは、ビルドログまたは--scanオプションを付けてGradleビルドを実行することで、

Gradleビルドスキャンで確認できます。

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

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

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

TIP

リリースバイナリは、linkRelease* Gradleタスクでビルドされます。それらはビルドログまたは

--scanオプションを付けてGradleビルドを実行することで、

Gradleビルドスキャンで確認できます。

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

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

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

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

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

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

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

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

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

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

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

NOTE

コンフィギュレーションキャッシュは、特に多くのCPUコアを搭載したマシンで、マシンに大きな負荷をかける可能性があるlink*タスクの並列実行も可能にします。この問題は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の一部だけがバイナリに再コンパイルされます。

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

Windowsの設定

WindowsセキュリティはKotlin/Nativeコンパイラの速度を低下させる可能性があります。これを避けるには、デフォルトで%\USERPROFILE%に位置する.konanディレクトリをWindowsセキュリティの除外に追加します。Windowsセキュリティに除外を追加する方法を学びましょう。