Zli × excite 合同LT にて発表
どのKotlinが一番速い?2020/09/26 Zli × excite 合同LT
View Slide
自己紹介HN: マヤミト本名: 富山雄太会津大学26期 (学部3年)Zli 現代表GitHub: https://github.com/yt8492趣味: なんでもKotlinで作ることyt8492.comTwitter: yt8492
前提知識: Kotlinについて- Androidアプリ開発などに主に使われているJVM言語- Kotlin/JSはKotlinをJSにトランスパイルする- Kotlin/NativeはKotlinをネイティブバイナリにコンパイルできる011011001010101110110001
ある日のぼく「Kotlinたのし〜〜〜〜〜!!!!!!」「Kotlin/JSたのし〜〜〜〜〜!!!!!!」「Kotlin/Nativeたのし〜〜〜〜〜!!!!!!」「どのKotlinが一番速いんだ……?」
検証方法1. Kotlin/MPPでプラットフォームに依存しないテスト用コードを書く2. ビルドするa. 実行可能なjarファイルを生成するb. nodeで実行可能なjsファイルを生成するc. MacOSネイティブで実行可能なバイナリファイルを生成する3. timeコマンドで計測する
環境- MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)- macOS Catalina 10.15.6- CPU 2.3GHz クアッドコアIntel Core i7- メモリ 32GB 3733MHz- OpenJDK 1.8.0_265- node 12.18.3
テスト用コードランダムに生成した配列をマージソートするだけのプログラム
各プラットフォームから参照するcommonモジュールに置いたテスト用コードを各プラットフォームのモジュールから参照するプラットフォームごとにmain関数を用意し、そこからテスト用の関数を呼び出す
JVM向けにビルド- Gradleのapplication pluginとshadow jar pluginの設定をjvm/build.gradle.ktsに記述- GradleのshadowJarタスクを実行し実行可能なjarファイルを生成./gradlew :jvm:shadowJar- jvm/build/libs以下に生成される
Node.js向けにビルド- Kotlin/JSのbrowser向けの設定をjs/build.gradle.ktsに記述- webpack-node-externalsの依存を追加し、node向けのビルドの設定を記述- GradleのbrowserProductionWebpackタスクを実行しjsファイルを生成./gradlew :js:browserProductionWebpack- js/build/distributions以下に生成される
MacOSネイティブ向けにビルド- Kotlin/NativeのMacOS向けの設定をnative/build.gradle.ktsに記述- GradleのmacosMainBinariesタスクを実行しバイナリファイルを生成./gradlew :native:macosMainBinaries- native/build/bin/macos/releaseExecutable以下に生成される
それぞれの実行結果
timeコマンドを使って測定- zshのtimeコマンドを使い、実行時間を測定する- それぞれ10回ずつ実行し、平均値を見る
予想- JVMのほうがNode.jsより早そう- バイナリになるKotlin/Nativeは結構速いのでは?
Kotlin/JVM 測定結果user: 1.229ssystem: 0.18stotal: 1.181s
Kotlin/JS 測定結果user: 1.683ssystem: 0.103stotal: 1.716s
Kotlin/Native 測定結果user: 2.060ssystem: 0.068stotal: 2.140s
おまけ: GraalVM native-imagejarファイルをnative-imageに一番速かったが今回の趣旨からは若干離れる気がしたので割愛
実験結果- Kotlin/JVM < Kotlin/JS < Kotlin/Native- Kotlin/Nativeはtotalで見るとKotlin/JVMの倍近く実行時間がかかったが、system時間は一番速かった- やはりJVMは速い
今回のリポジトリyt8492/SpeedTesthttps://github.com/yt8492/SpeedTest