Upgrade to Pro — share decks privately, control downloads, hide ads and more …

どのKotlinが一番速い?

 どのKotlinが一番速い?

Zli × excite 合同LT にて発表

Yuta Tomiyama

September 26, 2020
Tweet

More Decks by Yuta Tomiyama

Other Decks in Programming

Transcript

  1. どのKotlinが一番速い?
    2020/09/26 Zli × excite 合同LT

    View Slide

  2. 自己紹介
    HN: マヤミト
    本名: 富山雄太
    会津大学26期 (学部3年)
    Zli 現代表
    GitHub: https://github.com/yt8492
    趣味: なんでもKotlinで作ること
    yt8492.com
    Twitter: yt8492

    View Slide

  3. 前提知識: Kotlinについて
    - Androidアプリ開発などに主に使われているJVM言語
    - Kotlin/JSはKotlinをJSにトランスパイルする
    - Kotlin/NativeはKotlinをネイティブバイナリにコンパイルできる
    011011
    001010
    101110
    110001

    View Slide

  4. ある日のぼく
    「Kotlinたのし〜〜〜〜〜!!!!!!」
    「Kotlin/JSたのし〜〜〜〜〜!!!!!!」
    「Kotlin/Nativeたのし〜〜〜〜〜!!!!!!」
    「どのKotlinが一番速いんだ……?」

    View Slide

  5. 検証方法
    1. Kotlin/MPPでプラットフォームに依存しないテスト用コードを書く
    2. ビルドする
    a. 実行可能なjarファイルを生成する
    b. nodeで実行可能なjsファイルを生成する
    c. MacOSネイティブで実行可能なバイナリファイルを生成する
    3. timeコマンドで計測する

    View Slide

  6. 環境
    - 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

    View Slide

  7. テスト用コード
    ランダムに生成した配列をマージソートするだけのプログラム

    View Slide

  8. 各プラットフォームから参照する
    commonモジュールに置いたテスト用コードを各プラットフォー
    ムのモジュールから参照する
    プラットフォームごとにmain関数を用意し、そこからテスト用の
    関数を呼び出す

    View Slide

  9. JVM向けにビルド
    - Gradleのapplication pluginとshadow jar pluginの設定をjvm/build.gradle.ktsに
    記述
    - GradleのshadowJarタスクを実行し実行可能なjarファイルを生成
    ./gradlew :jvm:shadowJar
    - jvm/build/libs以下に生成される

    View Slide

  10. Node.js向けにビルド
    - Kotlin/JSのbrowser向けの設定をjs/build.gradle.ktsに記述
    - webpack-node-externalsの依存を追加し、node向けのビルドの設定を記述
    - GradleのbrowserProductionWebpackタスクを実行しjsファイルを生成
    ./gradlew :js:browserProductionWebpack
    - js/build/distributions以下に生成される

    View Slide

  11. MacOSネイティブ向けにビルド
    - Kotlin/NativeのMacOS向けの設定をnative/build.gradle.ktsに記述
    - GradleのmacosMainBinariesタスクを実行しバイナリファイルを生成
    ./gradlew :native:macosMainBinaries
    - native/build/bin/macos/releaseExecutable以下に生成される

    View Slide

  12. それぞれの実行結果

    View Slide

  13. timeコマンドを使って測定
    - zshのtimeコマンドを使い、実行時間を測定する
    - それぞれ10回ずつ実行し、平均値を見る

    View Slide

  14. 予想
    - JVMのほうがNode.jsより早そう
    - バイナリになるKotlin/Nativeは結構速いのでは?

    View Slide

  15. Kotlin/JVM 測定結果
    user: 1.229s
    system: 0.18s
    total: 1.181s

    View Slide

  16. Kotlin/JS 測定結果
    user: 1.683s
    system: 0.103s
    total: 1.716s

    View Slide

  17. Kotlin/Native 測定結果
    user: 2.060s
    system: 0.068s
    total: 2.140s

    View Slide

  18. おまけ: GraalVM native-image
    jarファイルをnative-imageに
    一番速かったが今回の趣旨からは若干離れる気がしたので割愛

    View Slide

  19. 実験結果
    - Kotlin/JVM < Kotlin/JS < Kotlin/Native
    - Kotlin/Nativeはtotalで見るとKotlin/JVMの倍近く実行時間がかかったが、system
    時間は一番速かった
    - やはりJVMは速い

    View Slide

  20. 今回のリポジトリ
    yt8492/SpeedTest
    https://github.com/yt8492/SpeedTest

    View Slide