Slide 1

Slide 1 text

͏Θͬ…΋͔ͯ͠͠ࢲͷίʔ υɺ஗͗͢…ʁ 2022.12.10 Kotlin Fest RyuNen344/Bunjiro Miyoshi

Slide 2

Slide 2 text

About Me • teamLab.Incॴଐ • ීஈ͸androidͱKMMϝΠϯ • DroidKaigiΞϓϦͷόοΫΤϯυ΍ͬͯ·͢ • લճ։࠵(2019)࣌ʹ͸KotlinΛॻ͍ͯ͢Β͍ͳ͔ͬͨ

Slide 3

Slide 3 text

͜Μͳܦݧ͋Γ·ͤΜ͔ʁ ૣ଎Ͱ͕͢

Slide 4

Slide 4 text

ͳΜ͔͜ͷॲཧɺ஗͍ͳɾɾɾɾ ͳͥɾɾɾɾɾɾ

Slide 5

Slide 5 text

JavaͷStreamͱKotlinͷSequence͸ ͲͬͪΛ࢖͑͹͍͍ͷɾɾɾʁ

Slide 6

Slide 6 text

ॲཧ଎౓վળͰ͖ͨɾɾɾɾɾ ͸ͣʂʂ(ຊ౰͔ɾɾʁʁ)

Slide 7

Slide 7 text

ܰ཰ʹܭଌ͠·͠ΐ͏ w w w w

Slide 8

Slide 8 text

Outline • kotlinx-benchmarkͱ͸ • JMH(Java Microbenchmark Harness)ͱ͸ • ΦʔιυοΫεͳ࢖͍ํ • ύϥϝʔλͱམͱ݀͠ • ϓϥοτϑΥʔϜ͝ͱͷҧ͍

Slide 9

Slide 9 text

WARNING

Slide 10

Slide 10 text

WARNING • JMHࣗମͷઆ໌ͱඃΔݸॴ͕ଟʑ͋Δ • android, iOS, watchOS • ݱঢ়͏·͘ಈ͔͢ํ๏͕ͳ͍ • android͸JMHपΓͷ஌ࣝΛ׆͔ͤΔ • Experimentalঢ়ଶͳͷͰWASMʹ͸৮Εͳ͍ • (ࢲͷखݩͰ͸ͦ΋ͦ΋ಈ͔ͤͳ͔ͬͨɾɾɾ)

Slide 11

Slide 11 text

ຊฤ

Slide 12

Slide 12 text

About kotlinx-benchmark • JetBrains͕։ൃ͍ͯ͠ΔMPPରԠͷϕϯνϚʔΫϥΠϒϥϦ • JMHͷIFΛ౿ऻͯͭ͘͠ΒΕ͍ͯΔ • PlatformʹΑͬͯ͸JMHʹ͋Δػೳ͕࢖͑ͳ͍ύλʔϯ͕͋Δ • Scopeͷछྨ͕͘͢ͳ͔ͬͨΓɾɾɾɾModeͷछྨ͕͘͢ͳ͔ͬ ͨΓɾɾɾ

Slide 13

Slide 13 text

About JMH(Java Microbenchmark Harness) • Java, JVM޲͚ͷܭଌπʔϧ • 2013೥ΑΓ։ൃ͞ΕͯΔOpenJDKϓϩδΣΫτͷ1෦ • Annotation Processor, ASMΛ࢖༻ͯ͠ܭଌ༻ͷίʔυΛੜ੒͢Δ • ੜ੒͞Εͨίʔυ࣮ߦͯ͠ॲཧ࣌ؒΛܭଌ͢Δ • kotlinx-benchmark΋͢΂ͯͷϓϥοτϑΥʔϜʹ͓͍ͯܭଌ༻ͷί ʔυΛੜ੒ͯ͠ܭଌ͢Δ

Slide 14

Slide 14 text

How To Use

Slide 15

Slide 15 text

Gradle Plugin, Moduleͷ௥Ճ • Gradle Plugin • + kotlinx-benchmark gradle plugin • + kotlin-all-open gradle plugin(for JVM) • Module • + kotlinx-benchmark-runtime

Slide 16

Slide 16 text

Gradle Plugin, Moduleͷ௥Ճ

Slide 17

Slide 17 text

Gradle Plugin, Moduleͷ௥Ճ benchmarkͱallopenͷgradle pluginΛ௥Ճ

Slide 18

Slide 18 text

Gradle Plugin, Moduleͷ௥Ճ JMH͸benchmark codeΛoverrideͯ͠ܭଌίʔυΛੜ੒͢Δ kotlinͷclass͸σϑΥϧτͩͱ fi nalʹͳΔͷͰall-openΛ͋ͯΔ

Slide 19

Slide 19 text

Gradle Plugin, Moduleͷ௥Ճ

Slide 20

Slide 20 text

Gradle Plugin, Moduleͷ௥Ճ targetͷ௥Ճ

Slide 21

Slide 21 text

Gradle Plugin, Moduleͷ௥Ճ common SourceSetʹruntime libraryΛ௥Ճ͢Δ

Slide 22

Slide 22 text

KMM޲͚ͷۤ೑ͷࡦ • benchmark͸ܭଌ༻ίʔυΛੜ੒͠ɺ࣮ߦ͢Δ͜ͱͰܭଌ͢Δ • 0.4.6࣌఺Ͱ͸android, iOSͳͲͷPlatformͰ࣮ߦ͢Δ࣮૷͕ߦΘΕͯ ͓Βͣಈ͔ͤͳ͍ • ͋Μ·Γʹ΋ͳͷͰͤΊͯPure Kotlinͳίʔυ͚ͩͰ΋ܭଌͰ͖ΔΑ ͏ʹ͢ΔͱJVMͱNativeͰͷڍಈࠩΛ࣮ࡍʹνΣοΫ͢Δ͜ͱ͕Ͱ͖ Δ

Slide 23

Slide 23 text

KMM޲͚ͷۤ೑ͷࡦ

Slide 24

Slide 24 text

KMM޲͚ͷۤ೑ͷࡦ ඇandroidίʔυʹͷΈґଘ͢ΔJVMͷSourceSetΛ࡞੒͢Δ androidίʔυΛJVMͷSourceSetʹґଘͤ͞Δ

Slide 25

Slide 25 text

KMM޲͚ͷۤ೑ͷࡦ ྆ํͰ࢖༻͢ΔSourceSetsΛ࡞੒͢Δ macOS, iOSΛ࡞੒ͨ͠SourceSetsʹґଘͤ͞Δ

Slide 26

Slide 26 text

Settings of BenchmarksExtension ઃఆΛม͑ͨϓϦηοτΛ࡞੒Ͱ͖Δ

Slide 27

Slide 27 text

Settings of BenchmarksExtension ର৅ͷSourceSetsΛొ࿥͢Δ

Slide 28

Slide 28 text

Impl of Benchmark Code

Slide 29

Slide 29 text

Impl of Benchmark Code @StateΛ෇༩ͯ͠ϕϯνϚʔΫΫϥε Ͱ͋Δ͜ͱΛίϯύΠϥʔʹ఻͑Δ

Slide 30

Slide 30 text

Impl of Benchmark Code ύϥϝʔλͷ४උͱϦηοτΛߦ͏ؔ਺ʹ@Setupɺ @TearDownΛ෇༩͢Δ

Slide 31

Slide 31 text

Impl of Benchmark Code ܭଌ͢ΔίʔυΛݺͼग़͢ϝιουʹ @BenchmarkΛ෇༩͢Δ

Slide 32

Slide 32 text

݁Ռ(txt)ͷ֬ೝ ଞʹ΋json, csv, scsvͷϑΥʔϚοτͰॻ͖ग़ͤΔ

Slide 33

Slide 33 text

Parameters And Traps

Slide 34

Slide 34 text

BenchmarksExtension Deep Dive • warmups(common) • JIT༻ύϥϝʔλ

Slide 35

Slide 35 text

BenchmarksExtension Deep Dive • warmups(common) • JIT༻ύϥϝʔλ JITͷઆ໌͍ͤͯͩ͘͞͞

Slide 36

Slide 36 text

Just In Time Compiler

Slide 37

Slide 37 text

Just In Time Compiler JIT͡Όͳ͍৔߹ Interpreter͕classϑΝΠϧΛ ஞ࣍ಡΈࠐΈɺػցޠʹม׵͠ ͳ͕Β࣮ߦ͢Δ

Slide 38

Slide 38 text

Just In Time Compiler JITͷ৔߹ ઌʹclassϑΝΠϧΛػցޠʹ ม׵͓ͯ͘͠

Slide 39

Slide 39 text

Just In Time Compiler Կ౓΋ݺͼग़͞ΕΔॲཧ͸ઌʹ Native CodeʹCompile͞ΕΔ

Slide 40

Slide 40 text

BenchmarksExtension Deep Dive • warmups(common) • JIT༻ύϥϝʔλ • ࣮ࡍͷܭଌલʹॲཧΛ૸ΒͤͯJITίϯύΠϥʔΛಇ͔ͤΔ • JITίϯύΠϥʔʹม׵͞ΕͨίʔυͰϕϯνϚʔΫΛऔΔΑ͏ʹ ͢Δ • (ART͸ಛघ͕ͩJetpack BenchmarkΛ࢖͏ͱΑ͠ͳʹͰ͖Δ)

Slide 41

Slide 41 text

BenchmarksExtension Deep Dive • nativeFork(native) • ͋ΔܭଌΛಉ͡ϓϩηεͰ࣮ߦ͢Δ͔ผϓϩηεͰ࣮ߦ͢Δ͔Λઃఆ͢Δ • =K/N RuntimeͷಡΈࠐΈ͔Β࢝ΊΔ͔Ͳ͏͔ • nativeGCAfterIteration(native) • ܭଌޙʹGarbage CollectΛ࣮ߦ͢Δ͔ઃఆ͢Δ • GCͷ࣮ߦ͸ίετ͕ߴ͍ͨΊσϑΥϧτ͸OFFʹͳ͍ͬͯΔ

Slide 42

Slide 42 text

Tips In Benchmark Code

Slide 43

Slide 43 text

Tips In Benchmark Code ࣅͨΑ͏ͳߏ੒Λݟͨ͜ͱ͸͋Γ·ͤΜ͔ʁ

Slide 44

Slide 44 text

Tips In Benchmark Code ࣅͨΑ͏ͳߏ੒Λݟͨ͜ͱ͸͋Γ·ͤΜ͔ʁ JUnitͷςετίʔυʹࣅ͍ͯΔʂʂ

Slide 45

Slide 45 text

Tips In Benchmark Code • JUnitͷςετίʔυʹࣅ͍ͯΔߏ੒ • ςετΛ࣮૷͢ΔࡍͷTips͕׆͔ͤΔ

Slide 46

Slide 46 text

Tips In Benchmark Code • @BenchmarkΛ෇༩ͨؔ͠਺಺Ͱݺͼग़͢ॲཧ͸ܭଌ͍ͨ͠ॲཧͷΈ ʹͳΕ͹ͳΔ΄Ͳྑ͍(ʹ݁Ռʹ༨ܭͳཁҼ͕ೖΒͳ͍) • 1ͭͷΫϥεɺؔ਺͸1ͭͷ໾ׂΛ୲͏Α͏ʹ͢Δ • ΫϥεࣗମΛૄ݁߹ʹͳΔΑ͏ʹઃܭ͢Δ(=CoroutineDispatcher ͳͲ͸injectͰ͖ΔΑ͏ʹ࡞Δɺetc…) ςετΛॻ͖΍͘͢͢ΔͱϕϯνϚʔΫ΋औΓ΍͘͢ͳΔ

Slide 47

Slide 47 text

Why In Benchmark Code

Slide 48

Slide 48 text

Why In Benchmark Code varͰએݴ͍ͯ͠ΔͷɺؾʹͳΓ·͢ΑͶʁ

Slide 49

Slide 49 text

Why In Benchmark Code • ίϯύΠϧ࣌఺Ͱৗʹݻఆ஋ʹͳΔίʔυ͸࠷దԽର৅ͱͯ͠ίʔυ লུ͞ΕΔՄೳੑ͕͋Δ • ࠷దԽର৅ʹͳΒͳ͍ίʔυʹ͢Δʹ͸ʁ • ܭଌର৅ίʔυʹ౉͢ม਺͸varͰ࣋ͬͯ@SetupͰઃఆ͢Δ

Slide 50

Slide 50 text

Why In Benchmark Code ܭଌର৅ͷฦΓ஋ΛBlackholeʹٵ Θ͍ͤͯΔͷؾʹͳΓ·͢ΑͶʁ

Slide 51

Slide 51 text

Why In Benchmark Code • ίϯύΠϧ࣌఺ͰৗʹฦΓ஋Λ࢖༻͠ͳ͍ίʔυ͸࠷దԽର৅ͱͯ͠ ίʔυ࡟আ͞ΕΔՄೳੑ͕͋Δ • ࠷దԽର৅ʹͳΒͳ͍ίʔυʹ͢Δʹ͸ʁ • ܭଌର৅ͷฦΓ஋ΛϕϯνϚʔΫϝιουͷฦΓ஋ʹ͢Δ • ܭଌର৅ϝιουͷฦΓ஋ΛBlackholeʹٵΘͤΔ Blackhole͸࠷దԽର৅ʹͤ͞ͳ͍ͨΊͷIF

Slide 52

Slide 52 text

Differences In Each Platform

Slide 53

Slide 53 text

JVM • JMH΁ͷAlias͕ுΒΕ͍ͯΔ • JVMʹݶͬͯݴ͑͹JMHͷػೳ͸ϑϧͰ࢖͑Δ

Slide 54

Slide 54 text

Native • ࣌ؒΛΧ΢ϯτ͢ΔίʔυΛKotlin/Native(C++)Ͱ࣮૷͍ͯ͠Δ

Slide 55

Slide 55 text

Native kotlinx.benchmark.native.NativeExecutor

Slide 56

Slide 56 text

Native K/NͰ࣌ؒपΓͷܭࢉΛ࣮૷͍ͯ͠Δ ਂງΓ͢ΔͱcppίʔυʹͨͲΓண͘

Slide 57

Slide 57 text

Native • ࣌ؒΛΧ΢ϯτ͢ΔίʔυΛKotlin/Native(C++)Ͱ࣮૷͍ͯ͠Δ • ReleaseϏϧυͰܭଌ͢ΔΑ͏ʹλεΫ͕࡞ΒΕΔͷͰσόοάγϯϘϧ ʹΑΔύϑΥʔϚϯεྼԽ͸ؾʹ͠ͳͯ͘Α͍ • nativeGCAfterIterationΛtrueʹ͢ΔҎ֎Ͱ͸Garbage CollectΛΩοΫ͠ ͍ͯΔՕॴ͸ͳ͍ͷͰ࢖͏ࡍ͸ϝϞϦʔώʔϓʹ΋ؾΛ࢖͏ํ͕Αͦ͞͏ • Blackholeͷ࣮૷͸pinϝιουΛݺͼग़͍ͯ͠Δ

Slide 58

Slide 58 text

JS • Benchmark.js͕಺෦Ͱಈ͍͍ͯΔ • ࣌ؒͷܭଌؚΊͯBenchmark.jsͰߦ͍ͬͯΔ • Blackholeͷ࣮૷͸nopeʹͳ͍ͬͯΔ • ݱঢ়JSͰ͸Blackhole͕ਖ਼͘͠ಈ࡞͠ͳ͍ͷͰ஫ҙ͕ඞཁ

Slide 59

Slide 59 text

Ex.) Language Optimization

Slide 60

Slide 60 text

Tailrec Optimization • Kotlinͷ࠶ؼ຤ඌΛ࠷దԽ͢Δम০ࢠ • Stack Over fl owͷ৺഑͕ͳ͘ͳΔ • ߴ଎Ͱޮ཰తͳLoopϕʔεͷ࣮૷ʹࠩ͠มΘΔ • https://kotlinlang.org/docs/functions.html#tail-recursive- functions w w

Slide 61

Slide 61 text

ͲΕ͙Β͍ߴ଎ͳΜͩΖ͏͔ʁ

Slide 62

Slide 62 text

Tailrec Optimization tailrec͋Γɾͳ͠຤ඌ࠶ؼͷϑΟϘφονؔ਺

Slide 63

Slide 63 text

Tailrec Optimization Decompileίʔυ

Slide 64

Slide 64 text

Tailrec OptimizationɿJVM tailrecΛ෇༩͢Δͱؔ਺͕2ഒҎ্଎͘ಈ࡞ͨ͠ Stack Over fl owͰॲཧ͕ࣦഊ͢Δ͜ͱ΋ͳ͔ͬͨ

Slide 65

Slide 65 text

Tailrec OptimizationɿNative JVM΄Ͳͷ༏Ґ͕ࠩ͋Δ݁ՌΛಘΒΕͳ͔͕ͬͨ ޮՌ͸͋Γͦ͏

Slide 66

Slide 66 text

Tailrec OptimizationɿNative • ผ్ ͷ຤ඌ࠶ؼΛ࡞੒ͯͨ͠Ίͨ͠ͱ͜ΖɺtailrecΛ෇༩ͨؔ͠ ਺͕1.25ഒ΄Ͳ଎͘ͳͬͨ • Ծઆ1ɿϧʔϓͩΖ͏͕࠶ؼͩΖ͏͕native͔ͩΒΊͪΌͪ͘Όૣ͍ʁ • Ծઆ2ɿLLVMͰͷcompile࣌ʹ΋࠷దԽ͕͔͔͍ͬͯΔ͔΋͠Εͳ ͍ʁLLVMͰͷ࠷దԽ͕ޮ͘ɾޮ͔ͳ͍͕͋Δͷ͔΋ɾɾɾɾ n ∑ k=1 k

Slide 67

Slide 67 text

Tailrec OptimizationɿJS JVM΄Ͳͷ༏Ґࠩ͸ͳ͍͕ޮՌൈ܈ Stack Over fl owͰॲཧ͕ࣦഊ͢Δ͜ͱ΋ͳ͔ͬͨ

Slide 68

Slide 68 text

Tailrec OptimizationɿJS • ผ్ ͷ຤ඌ࠶ؼΛࢼͨ͠ͱ͜ΖɺJVM΍NativeͷΑ͏ʹtailrecΛ ෇༩ͨ͠΄͏͕໌Β͔ʹ଎͘ͳΔͱ͍͏͜ͱ͸ͳ͔ͬͨ • ԾઆɿJS͸Numberͷൣғ͕JVMɺNativeͱҟͳΔͷͰͦͷลΓ͕Ө ڹ͍ͯ͠Δ͔΋ʁ n ∑ k=1 k kotlinx-benchmarkͷ͓ӄͰ͓खܰʹௐࠪͰ͖ͨ

Slide 69

Slide 69 text

·ͱΊ • kotlinx-benchmarkΛ࢖༻͢ΔͱखܰʹMPPͰϕϯνϚʔΫΛͱΔ͜ͱ ͕Ͱ͖Δ • ݱঢ়android, iOSͰ͸࢖͑ͳ͍(TaskΛ࡞Ε͹ߦ͚Δ͸ͣ) • ςετ͕ॻ͖΍͍࣮͢૷Λ͓ͯ͘͠ͱϕϯνϚʔΫ΋࣮૷͠΍͘͢ͳΔ • JVMͰ͸ಛʹίϯύΠϥʔʹΑΔ࠷దԽ΍JITΛҙࣝͨ͠ύϥϝʔλઃ ఆͱ࣮૷͕ඞཁ

Slide 70

Slide 70 text

͝ࢹௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ ܰ཰ʹܭଌ͠·͠ΐ͏ w w w w

Slide 71

Slide 71 text

ࢀߟࢿྉ • kotlin/kotlinx-benchmark • https://github.com/Kotlin/kotlinx-benchmark • openjdk/jmh • https://github.com/openjdk/jmh • Benchmark.js • https://benchmarkjs.com/ • tailrec • https://kotlinlang.org/docs/functions.html#tail-recursive-functions