Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
今すぐできる、ユーザーとチームのためのiOS速度改善 / Gunosy Kaizen Nigh...
Search
Seiji Takahashi
August 10, 2017
Programming
1
5.3k
今すぐできる、ユーザーとチームのためのiOS速度改善 / Gunosy Kaizen Night iOS development optimization
Gunosy カイゼン Night #1の発表資料です。
Seiji Takahashi
August 10, 2017
Tweet
Share
More Decks by Seiji Takahashi
See All by Seiji Takahashi
Go Backends for frontends with GraphQL and gRPC
timakin
6
3.8k
Design Pattern for Image and Text Composition in Go
timakin
5
6.6k
Golang API Testing the HARD way
timakin
13
6.5k
Head First Golang Image Package
timakin
2
10k
React Native Beyond Prototype
timakin
2
1.6k
Performance Optimization on Google AppEngine
timakin
5
6.2k
testcache.pdf
timakin
1
140
How Go cache
timakin
1
74
How Go cache tests
timakin
1
3k
Other Decks in Programming
See All in Programming
法律の脱レガシーに学ぶフロントエンド刷新
oguemon
5
730
Grafana Cloudとソラカメ
devoc
0
140
Domain-Driven Transformation
hschwentner
2
1.9k
第3回 Snowflake 中部ユーザ会- dbt × Snowflake ハンズオン
hoto17296
4
370
Compose でデザインと実装の差異を減らすための取り組み
oidy
1
300
2024年のkintone API振り返りと2025年 / kintone API look back in 2024
tasshi
0
220
SpringBoot3.4の構造化ログ #kanjava
irof
2
980
一休.com のログイン体験を支える技術 〜Web Components x Vue.js 活用事例と最適化について〜
atsumim
0
320
Amazon ECS とマイクロサービスから考えるシステム構成
hiyanger
2
520
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
730
AWS Lambda functions with C# 用の Dev Container Template を作ってみた件
mappie_kochi
0
240
Featured
See All Featured
A designer walks into a library…
pauljervisheath
205
24k
RailsConf 2023
tenderlove
29
1k
Documentation Writing (for coders)
carmenintech
67
4.6k
Building an army of robots
kneath
302
45k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Producing Creativity
orderedlist
PRO
343
39k
Visualization
eitanlees
146
15k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Transcript
ࠓ͙͢Ͱ͖Δɺ ϢʔβʔͱνʔϜͷͨΊͷ iOSվળ @__timakin__ / Gunosy ΧΠθϯ Night #1
ࣗݾհ • 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
߹ΘͤͯಡΈ͍ͨ https://speakerdeck.com/timakin/maikurotimudefalsegao-su-naxin-gui-kai-fa-wozhi-erukai-fa-fen-xi-ji-pan
ࠓ͢͜ͱ • iOS(Swift)։ൃͷΧΠθϯ • ϢʔβʔͷͨΊͷΧΠθϯ • νʔϜͷͨΊͷΧΠθϯ
Goͷɺ ͠·ͤΜʂ
Swift(iOSΞϓϦ)ྺ 3ϲ݄
ؒҧͬͯΔ͋Δ͔Ͱ͕͢ɺ ΑΖ͓͘͠ئ͍͠·͢ʂ
ͦͦͳΜͰ վળ͕ඞཁ͔ʁ
͍ͱԿ͕ى͜Δʁ
͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ • ਓੜແବײ͋ͬͯΞϓϦΘͳ͘ͳΔ
͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ • ਓੜແବײ͋ͬͯΞϓϦΘͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆
• ਓੜແବײ͋ͬͯΞϓϦΘͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆ • ใ͕ܽམͯ͠Πϥͭ͘ ͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ
• ਓੜແବײ͋ͬͯΞϓϦΘͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆ • ใ͕ܽམͯ͠Πϥͭ͘ • ͬͯΔؒʹbackground -> ଞͷΞϓϦʹભҠ͠
ͯΔͷΕΔ ͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ
• ਓੜແବײ͋ͬͯΞϓϦΘͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆ • ใ͕ܽམͯ͠Πϥͭ͘ • ͬͯΔؒʹbackground -> ଞͷΞϓϦʹભҠ͠
ͯΔͷΕΔ • ڝ߹ΞϓϦͱѱ͍ΛൺΒΕΔධՁϦεΫ ͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ
• ਓੜແବײ͋ͬͯΞϓϦΘͳ͘ͳΔ • ࡶΞϓϦײ͋ͬͯ։ൃνʔϜͷαϙʔτ͕ෆ҆ • ใ͕ܽམͯ͠Πϥͭ͘ • ͬͯΔؒʹbackground -> ଞͷΞϓϦʹભҠ͠
ͯΔͷΕΔ • ڝ߹ΞϓϦͱѱ͍ΛൺΒΕΔධՁϦεΫ • αʔϏεͷࢮ ͍ͱى͜Δ͜ͱɿΞϓϦମݧฤ
• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ ͍ͱى͜Δ͜ͱɿ։ൃฤ
• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΟϯυҠͬͯɺ͕ͯूத్͕ΕΔ ͍ͱى͜Δ͜ͱɿ։ൃฤ
• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΟϯυҠͬͯɺ͕ͯूத్͕ΕΔ • ͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ ͍ͱى͜Δ͜ͱɿ։ൃฤ
• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΟϯυҠͬͯɺ͕ͯूத్͕ΕΔ • ͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ • ݕূʹऔΕΔ͕࣌ؒݮΔ ͍ͱى͜Δ͜ͱɿ։ൃฤ
• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΟϯυҠͬͯɺ͕ͯूத్͕ΕΔ • ͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ • ݕূʹऔΕΔ͕࣌ؒݮΔ •
ϦϦʔε͕ΕΔ ͍ͱى͜Δ͜ͱɿ։ൃฤ
• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΟϯυҠͬͯɺ͕ͯूத్͕ΕΔ • ͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ • ݕূʹऔΕΔ͕࣌ؒݮΔ •
ϦϦʔε͕ΕΔ • Πέͯͳ͍։ൃνʔϜʹͳͬͯਓݺͳ͍ ͍ͱى͜Δ͜ͱɿ։ൃฤ
• ແҙࣝʹ࿘අ͞ΕΔ࣌ؒ • ΟϯυҠͬͯɺ͕ͯूத్͕ΕΔ • ͖ͬͯͯ࡞ۀΛࢥ͍ग़͢ͷʹίϯςΩετεΠο νͷίετ͕͔͔Δ • ݕূʹऔΕΔ͕࣌ؒݮΔ •
ϦϦʔε͕ΕΔ • Πέͯͳ͍։ൃνʔϜʹͳͬͯਓݺͳ͍ • αʔϏεͷࢮ ͍ͱى͜Δ͜ͱɿ։ൃฤ
• ͱʹ͔͘ࢮ͵ ͍ͱى͜Δ͜ͱɿ·ͱΊ
୭ͷͨΊʹ͘͢Δ͔
1. Ϣʔβʔ
2. νʔϜ
ϢʔβʔͷͨΊͷվળ • ىಈվળͷ͠·͢
https://developer.apple.com/videos/play/ wwdc2016/406/
https://developer.apple.com/videos/play/ wwdc2017/413/
ϢʔβʔͷͨΊͷվળ • ىಈ͕͘ͳΔݪҼ • ىಈΛܭଌ͢Δํ๏ • վળํ๏
ىಈ͕͘ͳΔݪҼ • Too many dylibs
ىಈ͕͘ͳΔݪҼ • Too many dylibs • Too many class/method declarations
• Too many dylibs • Too many class/method declarations •
Too many initializers ىಈ͕͘ͳΔݪҼ
• Too many dylibs • Too many class/method declarations •
Too many initializers • SDK ىಈ͕͘ͳΔݪҼ
• Too many dylibs • Too many class/method declarations •
Too many initializers • SDK • API Call ىಈ͕͘ͳΔݪҼ
• Too many dylibs • Too many class/method declarations •
Too many initializers • SDK • API Call • Middleware ىಈ͕͘ͳΔݪҼ
• ࣌ؒͷ͔͔ΔॲཧdaemonͰ Dyld3
• ࣌ؒͷ͔͔ΔॲཧdaemonͰ • ෳࡶͳॲཧ(Mach-O parse/compile) શ෦ͦͬͪʹدͤΔ Dyld3
• ࣌ؒͷ͔͔ΔॲཧdaemonͰ • ෳࡶͳॲཧ(Mach-O parse/compile) શ෦ͦͬͪʹدͤΔ • launch closure caching
Dyld3
ىಈܭଌ • Instruments • Time Profiler
ىಈܭଌ • Instruments • Time Profiler • Static Initializer Calls
(iOS11 / Mac OS High Sierra)
ىಈܭଌ • Instruments • Time Profiler • Static Initializer Calls
(iOS11 / Mac OS High Sierra) • DYLD_PRINT_STATISTICS
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%)
վળํ๏ • Fewer dylibs • ༻සͷ͍UIϥΠϒϥϦͳͲΛͻͨ͢ Βআڈ
վળํ๏ • Fewer initializers • initͰඞཁͳ͍ॲཧۃྗআ֎
վળํ๏ • Fewer initializers • initͰඞཁͳ͍ॲཧۃྗআ֎ • Debug༻ͷϥΠϒϥϦͷinitͳͲΛຊ൪Ͱআ֎
վળํ๏ • Fewer initializers • initͰඞཁͳ͍ॲཧۃྗআ֎ • Debug༻ͷϥΠϒϥϦͷinitͳͲΛຊ൪Ͱআ֎ • RxSwiftͰແҙࣝʹͬͯͨॏෳAPI
Callͷআڈ
վળํ๏ • Fewer initializers • initͰඞཁͳ͍ॲཧۃྗআ֎ • Debug༻ͷϥΠϒϥϦͷinitͳͲΛຊ൪Ͱআ֎ • RxSwiftͰແҙࣝʹͬͯͨॏෳAPI
Callͷআڈ • SDKͷฒྻsetup
վળํ๏ • Fewer classes/methods • structͰએݴͰ͖Δͷۃྗஔ͖͑
վળํ๏ • Fewer classes/methods • structͰએݴͰ͖Δͷۃྗஔ͖͑ • ͬͯͳ͍Ϋϥεɺ༻සͷ͍Ϋϥεͷআ ڈ
Ҏ্ɺϢʔβʔͷͨΊʹ ىಈΛ͘͢Δɻ
νʔϜͷͨΊͷվળ • Ϗϧυ࣌ؒͷΛ͠·͢ɻ
νʔϜͷͨΊͷվળ • Ϗϧυ͕͘ͳΔݪҼ • Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • վળํ๏
Ϗϧυ͕͘ͳΔݪҼ • ཁ͢ΔʹίϯύΠϥϥΠϒϥϦͷϚούʔ ʹࣄͤ͗͢͞
Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • -Xfrontend -debug-time-function-bodies
Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • -Xfrontend -debug-time-function-bodies • ؔ͝ͱͷϏϧυ࣌ؒܭଌ(Swift)
Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler
Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler
Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler • Rubygemύοέʔδ
Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler • Rubygemύοέʔδ • ϝιου୯ҐͰܭଌ࣌ؒ(ms)Λιʔτͯ͠ ςʔϒϧग़ྗ
Ϗϧυ࣌ؒΛܭଌ͢Δํ๏ • giginet/xcprofiler • Rubygemύοέʔδ • ϝιου୯ҐͰܭଌ࣌ؒ(ms)Λιʔτͯ͠ ςʔϒϧग़ྗ • giginet/danger-xcprofilerͱซ༻͍͍ͯ͠
͔
վળํ๏ • ͱΓ͋͑ͣ50~60msͷϥΠϯΛ͑ͨΒɺ ؾ͍ͮͨλΠϛϯάͰؔຖϏϧυ࣌ؒΛ ݮΒ͢
վળํ๏ • ܕਪආ͚Δ ʢClosureΓ, Variableએݴʣ
վળํ๏ • ܕਪආ͚Δ ʢClosureΓ, Variableએݴʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌มʹ֨ೲʣ
վળํ๏ • ܕਪආ͚Δ ʢClosureΓ, Variableએݴʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌มʹ֨ೲʣ • ྻ݁߹(don’t +,
append)
վળํ๏ • ܕਪආ͚Δ ʢClosureΓ, Variableએݴʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌มʹ֨ೲʣ • ྻ݁߹(don’t +,
append) • `??` ࡾ߲ԋࢉࢠΘͳ͍
վળํ๏ • ܕਪආ͚Δ ʢClosureΓ, Variableએݴʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌มʹ֨ೲʣ • ྻ݁߹(don’t +,
append) • `??` ࡾ߲ԋࢉࢠΘͳ͍ • lazy propertiesͷϓϥΠϕʔτϝιουԽ
վળํ๏ • ܕਪආ͚Δ ʢClosureΓ, Variableએݴʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌มʹ֨ೲʣ • ྻ݁߹(don’t +,
append) • `??` ࡾ߲ԋࢉࢠΘͳ͍ • lazy propertiesͷϓϥΠϕʔτϝιουԽ • ObjectMapperۃྗΘͳ͍
վળํ๏ • ܕਪආ͚Δ ʢClosureΓ, Variableએݴʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌มʹ֨ೲʣ • ྻ݁߹(don’t +,
append) • `??` ࡾ߲ԋࢉࢠΘͳ͍ • lazy propertiesͷϓϥΠϕʔτϝιουԽ • ObjectMapperۃྗΘͳ͍ • CocoaPodsΛv1.3.0Ҏ্ʹΞοϓάϨʔυ͢Δ
վળํ๏ • ܕਪආ͚Δ ʢClosureΓ, Variableએݴʣ • ϝιουνΣΠϯආ͚ΔʢҰ࣌มʹ֨ೲʣ • ྻ݁߹(don’t +,
append) • `??` ࡾ߲ԋࢉࢠΘͳ͍ • lazy propertiesͷϓϥΠϕʔτϝιουԽ • ObjectMapperۃྗΘͳ͍ • CocoaPodsΛv1.3.0Ҏ্ʹΞοϓάϨʔυ͢Δ
CocoaPods >= v1.3.0
CocoaPods >= v1.3.0 • Dynamic FrameworkͷpathΩϟογϡͷόά͕ मਖ਼͞ΕͨͬΆ͍ʁ
CocoaPods >= v1.3.0 • Dynamic FrameworkͷpathΩϟογϡͷόά͕ मਖ਼͞ΕͨͬΆ͍ʁ • ͍͘Β͍͘ͳΔɻ LUCRAॳظϏϧυ͡Όͳ͚Ε2ඵ͘Β͍ʹͳͬͨɻ
Ҏ্ɺνʔϜͷͨΊʹ ϏϧυΛ͘͢Δɻ
• αʔϏεͷࢮʹͭͳ͕ΔͷͰվળ͔ͬ͠Γɻ • ϢʔβʔͷͨΊͷվળ • XCodeඋ͚͑ͷػೳͰىಈ࣌ؒܭଌɻ • ίϯύΠϥɾϦϯΧʹ༏͍͠ίʔυɾߏΛɻ • νʔϜͷͨΊͷվળ
• पลπʔϧ͍ͭͭϏϧυ࣌ؒܭଌɻ • γϯλοΫεɺpodsͳͲಓʹվળɻ ·ͱΊ
Thank you!