K2コンパイラのベンチマーク

2024/06/26に公開

はじめに

2024年5月にKotlin最新版の2.0.0がリリースされ、K2コンパイラが安定版となりさまざまなプラットフォーム (JVM、ネイティブ、Wasなどなど)でデフォルトとなった。コンパイル速度や性能、開発者の体験などさまざまな改善がもたらされたようだが、かねてより気になっていたコンパイル速度に焦点を当てて検証してみた。

https://blog.jetbrains.com/ja/kotlin/2024/05/celebrating-kotlin-2-0-fast-smart-and-multiplatform/

https://github.com/JetBrains/kotlin/releases/tag/v2.0.0

検証

コンパイラのパフォーマンスを正確に測定するためにGradleに対して以下のオプションを設定した。

  • --no-build-cache
    • ビルドキャッシュを無効にする。これにより、各ビルドがキャッシュなしで完全に新規に行われることを保証。
  • --no-daemon
  • デーモンプロセスを使用せずにビルドを実行。これにより、デーモンプロセスがビルド時間に影響を与える可能性を排除。
  • --quiet
    • 必要最低限の情報のみを出力。これにより、ビルドの出力がベンチマークの結果に影響を与える可能性を排除。

また、まったく根拠はないがクラス数を以下規模と仮定してそれぞれベンチマークを行った。

  • 小規模なアプリケーション:100クラス
  • 中規模なアプリケーション:1000クラス
  • 大規模なアプリケーション:5000クラス

準備

検証で使用したプロジェクト。
https://github.com/htnk128/kotlin-benchmark

ベンチマークの流れは以下の通り。

  1. kotlin1.9のプロジェクトに対して指定された数だけクラスを作成してコンパイル所要時間を計測
  2. 同様の流れの処理をkotlin2.0に対しても実行

結果

それぞれ10回ベンチマークを行った結果を以下にまとめた。

100クラス

1回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 5964 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 6023 ms
Benchmarking end
2回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 6028 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 6065 ms
Benchmarking end
3回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 6006 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 6014 ms
Benchmarking end
4回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 5863 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 5984 ms
Benchmarking end
5回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 5785 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 6004 ms
Benchmarking end
6回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 5788 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 5972 ms
Benchmarking end
7回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 5826 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 5982 ms
Benchmarking end
8回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 5930 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 6044 ms
Benchmarking end
9回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 5831 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 5997 ms
Benchmarking end
10回目
$ bash benchmark.sh 100
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 5988 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 6028 ms
Benchmarking end
回数 kotlin1.9 kotlin2.0
1 5964 ms 6023 ms
2 6028 ms 6065 ms
3 6006 ms 6014 ms
4 5863 ms 5984 ms
5 5785 ms 6004 ms
6 5788 ms 5972 ms
7 5826 ms 5982 ms
8 5930 ms 6044 ms
9 5831 ms 5997 ms
10 5988 ms 6028 ms

1000クラス

1回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 9041 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8590 ms
Benchmarking end
2回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 8824 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8707 ms
Benchmarking end
3回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 9135 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8619 ms
Benchmarking end
4回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 8908 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8643 ms
Benchmarking end
5回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 8938 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8727 ms
Benchmarking end

6回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 8947 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8507 ms
Benchmarking end

7回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 8862 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8783 ms
Benchmarking end

8回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 8791 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8795 ms
Benchmarking end
9回目
$ bash benchmark.sh 1000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 8729 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 8616 ms
Benchmarking end
10回目
回数 kotlin1.9 kotlin2.0
1 9041 ms 8590 ms
2 8824 ms 8707 ms
3 9135 ms 8619 ms
4 8908 ms 8643 ms
5 8938 ms 8727 ms
6 8947 ms 8507 ms
7 8862 ms 8783 ms
8 8791 ms 8795 ms
9 8729 ms 8616 ms
10 8868 ms 8893 ms

5000クラス

1回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 23501 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 14345 ms
Benchmarking end
2回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 23232 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13949 ms
Benchmarking end
3回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 23534 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13943 ms
Benchmarking end

4回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 25962 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13963 ms
Benchmarking end
5回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 23286 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13624 ms
Benchmarking end
6回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 22960 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13384 ms
Benchmarking end
7回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 23388 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13080 ms
Benchmarking end
8回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 22972 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13156 ms
Benchmarking end
9回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 22331 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13164 ms
Benchmarking end
10回目
$ bash benchmark.sh 5000
Benchmarking start
Kotlin plugin version: 1.9.23
Kotlin 1.9 compile time: 22712 ms
Kotlin plugin version: 2.0.0
Kotlin 2.0 compile time: 13250 ms
Benchmarking end
回数 kotlin1.9 kotlin2.0
1 23501 ms 14345 ms
2 23232 ms 13949 ms
3 23534 ms 13943 ms
4 25962 ms 13963 ms
5 23286 ms 13624 ms
6 22960 ms 13384 ms
7 23388 ms 13080 ms
8 22972 ms 13156 ms
9 22331 ms 13164 ms
10 22712 ms 13250 ms

まとめ

小規模、大規模で仮定したクラス数ではほぼ同じコンパイル時間で差は見られなかった。
しかしながら、大規模と仮定したクラス数では2倍近い差が見られた。
この結果から、今回はコンパイル速度のみに焦点を当てたがK2コンパイラの導入によってかなりのコンパイル速度が期待できると言える。
もちろん、KMPなどの注目すべき改善なども加わっているのでK2コンパイラの導入によって開発体験やアプリケーション自体の性能なども合わせて変わるため今後もKotlinの成長に期待したい。

Discussion