Slide 1

Slide 1 text

Sansan株式会社 部署 名前 K2コンパイラでビルド速度改善 Sansan技術本部 After Kotlin Fest 2024 LT Night @Sansan 技術本部 Mobile Application Group ⼤塚 丈

Slide 2

Slide 2 text

⼤塚 丈 Sansan株式会社 技術本部 Mobile Application Group 2022年 Sansan株式会社に新卒として⼊社。 名刺アプリ「Eight」のAndroidアプリの開発と、営業DXサービス 「Sansan」とEightの両プロダクトをまたぐプロダクト横断チー ムの⼀員として、モバイル領域の中⻑期的な技術的課題の解決や、 PoCの開発を担当しています。

Slide 3

Slide 3 text

「もっとKotlinを好きになる!K2時代のKotlin Compiler Plugin開発」のセッ ションではプラグインに留まらず、K2コンパイラ⾃体の理解を深める機会に なりました。(Ask The Speaker もありがとうございました 🙇) K2コンパイラの理解が深まったので、 今回はK2コンパイラによるビルドパフォーマンスについて話します💪 はじめに

Slide 4

Slide 4 text

K2コンパイラの概要

Slide 5

Slide 5 text

- K2以前はPSIと呼ばれる構⽂⽊と BindingContextと呼ばれるセマ ンティック情報を持つテーブルを 出⼒していた - K2コンパイラからはFIRという 中間状態を⽣成するようになった K2コンパイラの概要 Frontend JVM IR Backend JS IR Backend FIR *.kt *.class *.js

Slide 6

Slide 6 text

- BindingContextを使わなくなった - K2からはデータ構造がFIR1つになった。 - BindingContextは内部実装がMap。Mapはそもそもあまり早くないし、Map が⼤きくなるとCPUキャッシュに⼊らなくなり遅くなる。 K2コンパイラでパフォーマンスが改善する理由

Slide 7

Slide 7 text

ビルドパフォーマンスの測り⽅

Slide 8

Slide 8 text

Build Analyzer Android Studio に内包されているツール。 ビルド時間に影響しているタスクやプラグインをグラフィカルに確認できる。 Gradle Profile Option --profile オプションをつけるだけでGradleの各タスクにどれだけ時間がかかっているか分かる。 Gradle Profiler Gradle ビルドのプロファイリングおよびベンチマーク情報の収集を⾃動化するツール。 ビルドシナリオを定義してベンチマークをとるだけでなく、プロファイラと連携することも可能。 Gradle Build Scan Gradle社が提供しているビルド分析サービス。 Web上でビルドの分析情報が閲覧できて便利だが、外部にビルド情報が送信されてしまうので注意。 Kotlin Build Report ⭐ コンパイルタスク内の各フェーズでの時間、メモリ使⽤量、GC、コンパイルがインクリメンタルにできなかった理由など が分かる。 ビルドパフォーマンスを測定するツール

Slide 9

Slide 9 text

使い⽅ - gradle.propertiesに1⾏追加 Kotlin Build Report kotlin.build.report.output = file

Slide 10

Slide 10 text

- Kotlinが関係するタスクについて 詳細な情報を出⼒してくれる - フェーズごとの実⾏時間である Time metrics とメモリ使⽤量など が分かるSize metricsなどを出⼒ - Kotlin 2.0 からコンパイラフロン トエンドが変わったことでレポー トの内容も変化している Kotlin Build Report

Slide 11

Slide 11 text

Kotlin Build Report - Time metrics Kotlin 1.9.x Kotlin 2.0.0

Slide 12

Slide 12 text

Kotlin Build Report - Time metrics 内部表現(IR)をより単純な形に変換 すべての特殊な⾔語構成要素をデシュガーする FIRからIRへの変換 最適化された内部表現を最終的なバイトコードに変換 ソースコードを解析してFIRを構築する ソースコードからバイトコードを⽣成するまでの時間

Slide 13

Slide 13 text

Kotlin Build Report - Size metrics Kotlin 1.9.x Kotlin 2.0.0

Slide 14

Slide 14 text

Eight Android アプリで測定!

Slide 15

Slide 15 text

./gradlew clean && ./gradlew --profile assemble{$Flavor}Debug --no-daemon --no-build-cache --no-configuration-cache --max-workers=1 --offline --rerun-tasks コマンド

Slide 16

Slide 16 text

全体のビルド時間は16秒(約4%)短縮 🎉 - Kotlin 1.9.22 で 369秒 - Kotlin 2.0で 353秒 コンパイルタスクに絞ると21秒(約20%)短縮🎉 - Kotlin 1.9.22で 101秒 - Kotlin 2.0で 80秒 ただし、効果のあったモジュールとそうではないモジュールがある 🤔 ビルド時間

Slide 17

Slide 17 text

コンパイルタスクの⽐較

Slide 18

Slide 18 text

Kotlin Build Report を確認すると分析フェーズで改善を確認 - Compiler code analysis - Kotlin 1.9.22 : 2.17 (s) - Kotlin 2.0.0 : 1.02 (s) - Analysis lines per second - Kotlin 1.9.22 : 5638 - Kotlin 2.0.0 : 12026 効果のあったモジュール

Slide 19

Slide 19 text

分析フェーズでの改善は確認できなかった - Compiler code analysis - Kotlin 1.9.22 : 3.14 (s) - Kotlin 2.0.0 : 3.14 (s) - Analysis lines per second - Kotlin 1.9.22 : 4737 - Kotlin 2.0.0 : 4776 効果のなかったモジュール

Slide 20

Slide 20 text

Componentモジュールに含まれているクラス - Activity、ViewModel、RecyclerViewAdapterなどUI関連のコード Domainモジュールに含まれるクラス - data classやsealed classなどでデータ構造を表現したシンプルなクラス → 1.9.xで BindingContext の肥⼤によってビルド速度が低下していて K2で改善されたのではないか 考察

Slide 21

Slide 21 text

- K2コンパイラを使⽤するとビルドパフォーマンスが向上します - ビルド内のステップを⾒ることでFIRの導⼊を体感することができた - プロダクトのコードをKotlin 2.0 にアップデートすることでビルド速度が 向上することも確認できた! - 特に分析フェーズの向上が⼤きく BindingContext が肥⼤化していたコー ドのコンパイルが短縮したのではないかと推測している まとめ

Slide 22

Slide 22 text

No content