Slide 1

Slide 1 text

ࠓ͙͢Ͱ͖Δɺ ϢʔβʔͱνʔϜͷͨΊͷ iOS଎౓վળ @__timakin__ / Gunosy ΧΠθϯ Night #1

Slide 2

Slide 2 text

ࣗݾ঺հ • Github: timakin / Twitter: @__timakin__ • Contributor of Go / golang.tokyo / roppongi-golunch • Gunosy ৽نࣄۀ։ൃࣨ ॴଐ • Go / Swift • Recently Contributed / Created • giginet/xcprofiler • mercari/gaurun • timakin/gopli • timakin/ssm2env • timakin/md2mid • timakin/autocompl

Slide 3

Slide 3 text

߹ΘͤͯಡΈ͍ͨ https://speakerdeck.com/timakin/maikurotimudefalsegao-su-naxin-gui-kai-fa-wozhi-erukai-fa-fen-xi-ji-pan

Slide 4

Slide 4 text

ࠓ೔࿩͢͜ͱ • iOS(Swift)։ൃͷ଎౓ΧΠθϯ • ϢʔβʔͷͨΊͷ଎౓ΧΠθϯ • νʔϜͷͨΊͷ଎౓ΧΠθϯ

Slide 5

Slide 5 text

Goͷ࿩ɺ
 ͠·ͤΜʂ

Slide 6

Slide 6 text

Swift(iOSΞϓϦ)ྺ 3ϲ݄

Slide 7

Slide 7 text

ؒҧͬͯΔ఺͋Δ͔΋Ͱ͕͢ɺ ΑΖ͓͘͠ئ͍͠·͢ʂ

Slide 8

Slide 8 text

ͦ΋ͦ΋ͳΜͰ
 ଎౓վળ͕ඞཁ͔ʁ

Slide 9

Slide 9 text

஗͍ͱԿ͕ى͜Δʁ

Slide 10

Slide 10 text

஗͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ • ਓੜແବײ͋ͬͯΞϓϦ࢖Θͳ͘ͳΔ

Slide 11

Slide 11 text

஗͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ • ਓੜແବײ͋ͬͯΞϓϦ࢖Θͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆

Slide 12

Slide 12 text

• ਓੜແବײ͋ͬͯΞϓϦ࢖Θͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆ • ৘ใ͕ܽམͯ͠Πϥͭ͘ ஗͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ

Slide 13

Slide 13 text

• ਓੜແବײ͋ͬͯΞϓϦ࢖Θͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆ • ৘ใ͕ܽམͯ͠Πϥͭ͘ • ଴ͬͯΔؒʹbackground -> ଞͷΞϓϦʹભҠ͠ ͯ໭Δͷ๨ΕΔ ஗͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ

Slide 14

Slide 14 text

• ਓੜແବײ͋ͬͯΞϓϦ࢖Θͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆ • ৘ใ͕ܽམͯ͠Πϥͭ͘ • ଴ͬͯΔؒʹbackground -> ଞͷΞϓϦʹભҠ͠ ͯ໭Δͷ๨ΕΔ • ڝ߹ΞϓϦͱѱ͍఺Λൺ΂ΒΕΔධՁϦεΫ ஗͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ

Slide 15

Slide 15 text

• ਓੜແବײ͋ͬͯΞϓϦ࢖Θͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆ • ৘ใ͕ܽམͯ͠Πϥͭ͘ • ଴ͬͯΔؒʹbackground -> ଞͷΞϓϦʹભҠ͠ ͯ໭Δͷ๨ΕΔ • ڝ߹ΞϓϦͱѱ͍఺Λൺ΂ΒΕΔධՁϦεΫ • αʔϏεͷࢮ ஗͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ

Slide 16

Slide 16 text

• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ ஗͍ͱى͜Δ͜ͱɿ։ൃฤ

Slide 17

Slide 17 text

• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΢Οϯυ΢Ҡͬͯɺ΍͕ͯूத్͕੾ΕΔ ஗͍ͱى͜Δ͜ͱɿ։ൃฤ

Slide 18

Slide 18 text

• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΢Οϯυ΢Ҡͬͯɺ΍͕ͯूத్͕੾ΕΔ • ໭͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ ஗͍ͱى͜Δ͜ͱɿ։ൃฤ

Slide 19

Slide 19 text

• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΢Οϯυ΢Ҡͬͯɺ΍͕ͯूத్͕੾ΕΔ • ໭͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ • ݕূʹऔΕΔ͕࣌ؒݮΔ ஗͍ͱى͜Δ͜ͱɿ։ൃฤ

Slide 20

Slide 20 text

• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΢Οϯυ΢Ҡͬͯɺ΍͕ͯूத్͕੾ΕΔ • ໭͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ • ݕূʹऔΕΔ͕࣌ؒݮΔ • ϦϦʔε͕஗ΕΔ ஗͍ͱى͜Δ͜ͱɿ։ൃฤ

Slide 21

Slide 21 text

• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΢Οϯυ΢Ҡͬͯɺ΍͕ͯूத్͕੾ΕΔ • ໭͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ • ݕূʹऔΕΔ͕࣌ؒݮΔ • ϦϦʔε͕஗ΕΔ • Πέͯͳ͍։ൃνʔϜʹͳͬͯਓ΋ݺ΂ͳ͍ ஗͍ͱى͜Δ͜ͱɿ։ൃฤ

Slide 22

Slide 22 text

• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΢Οϯυ΢Ҡͬͯɺ΍͕ͯूத్͕੾ΕΔ • ໭͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ • ݕূʹऔΕΔ͕࣌ؒݮΔ • ϦϦʔε͕஗ΕΔ • Πέͯͳ͍։ൃνʔϜʹͳͬͯਓ΋ݺ΂ͳ͍ • αʔϏεͷࢮ ஗͍ͱى͜Δ͜ͱɿ։ൃฤ

Slide 23

Slide 23 text

• ͱʹ͔͘ࢮ͵ ஗͍ͱى͜Δ͜ͱɿ·ͱΊ

Slide 24

Slide 24 text

୭ͷͨΊʹ଎͘͢Δ͔

Slide 25

Slide 25 text

1. Ϣʔβʔ

Slide 26

Slide 26 text

2. νʔϜ

Slide 27

Slide 27 text

ϢʔβʔͷͨΊͷ଎౓վળ • ىಈվળͷ࿩͠·͢

Slide 28

Slide 28 text

https://developer.apple.com/videos/play/ wwdc2016/406/

Slide 29

Slide 29 text

https://developer.apple.com/videos/play/ wwdc2017/413/

Slide 30

Slide 30 text

ϢʔβʔͷͨΊͷ଎౓վળ • ىಈ͕஗͘ͳΔݪҼ • ىಈΛܭଌ͢Δํ๏ • վળํ๏

Slide 31

Slide 31 text

ىಈ͕஗͘ͳΔݪҼ • Too many dylibs

Slide 32

Slide 32 text

ىಈ͕஗͘ͳΔݪҼ • Too many dylibs • Too many class/method declarations

Slide 33

Slide 33 text

• Too many dylibs • Too many class/method declarations • Too many initializers ىಈ͕஗͘ͳΔݪҼ

Slide 34

Slide 34 text

• Too many dylibs • Too many class/method declarations • Too many initializers • SDK ىಈ͕஗͘ͳΔݪҼ

Slide 35

Slide 35 text

• Too many dylibs • Too many class/method declarations • Too many initializers • SDK • API Call ىಈ͕஗͘ͳΔݪҼ

Slide 36

Slide 36 text

• Too many dylibs • Too many class/method declarations • Too many initializers • SDK • API Call • Middleware ىಈ͕஗͘ͳΔݪҼ

Slide 37

Slide 37 text

• ࣌ؒͷ͔͔Δॲཧ͸daemonͰ Dyld3

Slide 38

Slide 38 text

• ࣌ؒͷ͔͔Δॲཧ͸daemonͰ • ෳࡶͳॲཧ(Mach-O parse/compile)
 ͸શ෦ͦͬͪʹدͤΔ Dyld3

Slide 39

Slide 39 text

• ࣌ؒͷ͔͔Δॲཧ͸daemonͰ • ෳࡶͳॲཧ(Mach-O parse/compile)
 ͸શ෦ͦͬͪʹدͤΔ • launch closure caching Dyld3

Slide 40

Slide 40 text

ىಈܭଌ • Instruments • Time Profiler

Slide 41

Slide 41 text

ىಈܭଌ • Instruments • Time Profiler • Static Initializer Calls
 (iOS11 / Mac OS High Sierra)

Slide 42

Slide 42 text

ىಈܭଌ • Instruments • Time Profiler • Static Initializer Calls
 (iOS11 / Mac OS High Sierra) • DYLD_PRINT_STATISTICS

Slide 43

Slide 43 text

DYLD_PRINT_STATISTICS Total pre-main time: 2.5 seconds (100.0%) dylib loading time: 1.3 seconds (54.0%) rebase/binding time: 111.49 milliseconds (4.3%) ObjC setup time: 432.17 milliseconds (16.9%) initializer time: 631.54 milliseconds (24.7%) slowest intializers : libSystem.B.dylib : 22.83 milliseconds (0.8%) xxx-ios : 500.72 milliseconds (19.5%)

Slide 44

Slide 44 text

վળํ๏ • Fewer dylibs • ࢖༻ස౓ͷ௿͍UIϥΠϒϥϦͳͲΛͻͨ͢ Βআڈ

Slide 45

Slide 45 text

վળํ๏ • Fewer initializers • initͰඞཁͳ͍ॲཧ͸ۃྗআ֎

Slide 46

Slide 46 text

վળํ๏ • Fewer initializers • initͰඞཁͳ͍ॲཧ͸ۃྗআ֎ • Debug༻ͷϥΠϒϥϦͷinitͳͲΛຊ൪Ͱআ֎

Slide 47

Slide 47 text

վળํ๏ • Fewer initializers • initͰඞཁͳ͍ॲཧ͸ۃྗআ֎ • Debug༻ͷϥΠϒϥϦͷinitͳͲΛຊ൪Ͱআ֎ • RxSwiftͰແҙࣝʹ΍ͬͯͨॏෳAPI Callͷআڈ

Slide 48

Slide 48 text

վળํ๏ • Fewer initializers • initͰඞཁͳ͍ॲཧ͸ۃྗআ֎ • Debug༻ͷϥΠϒϥϦͷinitͳͲΛຊ൪Ͱআ֎ • RxSwiftͰແҙࣝʹ΍ͬͯͨॏෳAPI Callͷআڈ • SDKͷฒྻsetup

Slide 49

Slide 49 text

վળํ๏ • Fewer classes/methods • structͰએݴͰ͖Δ΋ͷ͸ۃྗஔ͖׵͑

Slide 50

Slide 50 text

վળํ๏ • Fewer classes/methods • structͰએݴͰ͖Δ΋ͷ͸ۃྗஔ͖׵͑ • ࢖ͬͯͳ͍Ϋϥεɺ࢖༻ස౓ͷ௿͍Ϋϥεͷআ ڈ

Slide 51

Slide 51 text

Ҏ্ɺϢʔβʔͷͨΊʹ
 ىಈΛ଎͘͢Δ࿩ɻ

Slide 52

Slide 52 text

νʔϜͷͨΊͷ଎౓վળ • Ϗϧυ࣌ؒͷ࿩Λ͠·͢ɻ

Slide 53

Slide 53 text

νʔϜͷͨΊͷ଎౓վળ • Ϗϧυ͕஗͘ͳΔݪҼ • Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • վળํ๏

Slide 54

Slide 54 text

Ϗϧυ͕஗͘ͳΔݪҼ • ཁ͢ΔʹίϯύΠϥ΍ϥΠϒϥϦͷϚούʔ ʹ࢓ࣄͤ͗͢͞

Slide 55

Slide 55 text

Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • -Xfrontend -debug-time-function-bodies

Slide 56

Slide 56 text

Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • -Xfrontend -debug-time-function-bodies • ؔ਺͝ͱͷϏϧυ࣌ؒܭଌ(Swift)

Slide 57

Slide 57 text

Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler

Slide 58

Slide 58 text

Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler

Slide 59

Slide 59 text

Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler • Ruby੡gemύοέʔδ

Slide 60

Slide 60 text

Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler • Ruby੡gemύοέʔδ • ϝιου୯ҐͰܭଌ࣌ؒ(ms)Λιʔτͯ͠ ςʔϒϧग़ྗ

Slide 61

Slide 61 text

Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler • Ruby੡gemύοέʔδ • ϝιου୯ҐͰܭଌ࣌ؒ(ms)Λιʔτͯ͠ ςʔϒϧग़ྗ • giginet/danger-xcprofilerͱซ༻ͯ͠΋͍͍ ͔΋

Slide 62

Slide 62 text

վળํ๏ • ͱΓ͋͑ͣ50~60msͷϥΠϯΛ௒͑ͨΒɺ
 ؾ͍ͮͨλΠϛϯάͰؔ਺ຖϏϧυ࣌ؒΛ
 ݮΒ͢

Slide 63

Slide 63 text

վળํ๏ • ܕਪ࿦ආ͚Δ
 ʢClosure໭Γ஋, Variableએݴ౳ʣ

Slide 64

Slide 64 text

վળํ๏ • ܕਪ࿦ආ͚Δ
 ʢClosure໭Γ஋, Variableએݴ౳ʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌ม਺ʹ֨ೲʣ

Slide 65

Slide 65 text

վળํ๏ • ܕਪ࿦ආ͚Δ
 ʢClosure໭Γ஋, Variableએݴ౳ʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌ม਺ʹ֨ೲʣ • ഑ྻ݁߹(don’t +, append)

Slide 66

Slide 66 text

վળํ๏ • ܕਪ࿦ආ͚Δ
 ʢClosure໭Γ஋, Variableએݴ౳ʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌ม਺ʹ֨ೲʣ • ഑ྻ݁߹(don’t +, append) • `??` ΍ࡾ߲ԋࢉࢠ࢖Θͳ͍

Slide 67

Slide 67 text

վળํ๏ • ܕਪ࿦ආ͚Δ
 ʢClosure໭Γ஋, Variableએݴ౳ʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌ม਺ʹ֨ೲʣ • ഑ྻ݁߹(don’t +, append) • `??` ΍ࡾ߲ԋࢉࢠ࢖Θͳ͍ • lazy propertiesͷϓϥΠϕʔτϝιουԽ

Slide 68

Slide 68 text

վળํ๏ • ܕਪ࿦ආ͚Δ
 ʢClosure໭Γ஋, Variableએݴ౳ʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌ม਺ʹ֨ೲʣ • ഑ྻ݁߹(don’t +, append) • `??` ΍ࡾ߲ԋࢉࢠ࢖Θͳ͍ • lazy propertiesͷϓϥΠϕʔτϝιουԽ • ObjectMapperۃྗ࢖Θͳ͍

Slide 69

Slide 69 text

վળํ๏ • ܕਪ࿦ආ͚Δ
 ʢClosure໭Γ஋, Variableએݴ౳ʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌ม਺ʹ֨ೲʣ • ഑ྻ݁߹(don’t +, append) • `??` ΍ࡾ߲ԋࢉࢠ࢖Θͳ͍ • lazy propertiesͷϓϥΠϕʔτϝιουԽ • ObjectMapperۃྗ࢖Θͳ͍ • CocoaPodsΛv1.3.0Ҏ্ʹΞοϓάϨʔυ͢Δ

Slide 70

Slide 70 text

վળํ๏ • ܕਪ࿦ආ͚Δ
 ʢClosure໭Γ஋, Variableએݴ౳ʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌ม਺ʹ֨ೲʣ • ഑ྻ݁߹(don’t +, append) • `??` ΍ࡾ߲ԋࢉࢠ࢖Θͳ͍ • lazy propertiesͷϓϥΠϕʔτϝιουԽ • ObjectMapperۃྗ࢖Θͳ͍ • CocoaPodsΛv1.3.0Ҏ্ʹΞοϓάϨʔυ͢Δ

Slide 71

Slide 71 text

CocoaPods >= v1.3.0

Slide 72

Slide 72 text

CocoaPods >= v1.3.0 • Dynamic FrameworkͷpathΩϟογϡͷόά͕
 मਖ਼͞ΕͨͬΆ͍ʁ

Slide 73

Slide 73 text

CocoaPods >= v1.3.0 • Dynamic FrameworkͷpathΩϟογϡͷόά͕
 मਖ਼͞ΕͨͬΆ͍ʁ • ΍͹͍͘Β͍଎͘ͳΔɻ
 LUCRA͸ॳظϏϧυ͡Όͳ͚Ε͹2ඵ͘Β͍ʹͳͬͨɻ

Slide 74

Slide 74 text

Ҏ্ɺνʔϜͷͨΊʹ
 ϏϧυΛ଎͘͢Δ࿩ɻ

Slide 75

Slide 75 text

• αʔϏεͷࢮʹͭͳ͕ΔͷͰ଎౓վળ͔ͬ͠Γɻ • ϢʔβʔͷͨΊͷվળ • XCodeඋ͑෇͚ͷػೳͰىಈ࣌ؒܭଌɻ • ίϯύΠϥɾϦϯΧʹ༏͍͠ίʔυɾߏ੒Λɻ • νʔϜͷͨΊͷվળ • पลπʔϧ࢖͍ͭͭϏϧυ࣌ؒܭଌɻ • γϯλοΫεɺpodsͳͲ஍ಓʹվળɻ ·ͱΊ

Slide 76

Slide 76 text

Thank you!