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
5.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
今すぐできる、ユーザーとチームのためのiOS速度改善 / Gunosy Kaizen Night iOS development optimization
Gunosy カイゼン Night #1の発表資料です。
Seiji Takahashi
August 10, 2017
More Decks by Seiji Takahashi
See All by Seiji Takahashi
AIエージェントのデータガバナンスの最新事情。そしてプロダクトのAIファースト化
timakin
0
3.8k
営業、広報、開発。 多面的なAIネイティブ化のための 基盤について
timakin
0
250
権限と承認 〜ユーザー信頼性に繋がる管理画面の根幹について〜
timakin
0
1k
Go Backends for frontends with GraphQL and gRPC
timakin
6
4.3k
Design Pattern for Image and Text Composition in Go
timakin
5
6.9k
Golang API Testing the HARD way
timakin
13
7.3k
Head First Golang Image Package
timakin
2
10k
React Native Beyond Prototype
timakin
2
1.7k
Performance Optimization on Google AppEngine
timakin
5
6.7k
Other Decks in Programming
See All in Programming
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
4
2.4k
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
250
ソフトウェアラスタライザ
fadis
1
770
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
550
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
120
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
270
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
250
書籍「プロフェッショナルAI駆動開発」紹介スライド
juntaromatsumoto
0
900
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
420
T3DD26: From RAGs to Riches
martinhelmich
0
130
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
1
110
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
210
Featured
See All Featured
Ethics towards AI in product and experience design
skipperchong
2
360
Navigating Weather and Climate Data
rabernat
0
500
New Earth Scene 8
popppiees
3
2.5k
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Mobile First: as difficult as doing things right
swwweet
225
10k
Building an army of robots
kneath
306
46k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
400
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
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!