Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Swift Performance
Kishikawa Katsumi
February 20, 2016
3
1.3k
Swift Performance
Swift Optimization Tips
Kishikawa Katsumi
February 20, 2016
Tweet
Share
More Decks by Kishikawa Katsumi
See All by Kishikawa Katsumi
家のいろいろな数値を計測する
kishikawakatsumi
4
1.2k
GitHub Actionsでテストの結果をわかりやすく表示する
kishikawakatsumi
1
150
GitHub Actionsでテストの結果をわかりやすく表示する
kishikawakatsumi
1
770
Network ExtensionでiOSデバイス上で動くパケットキャプチャを作る
kishikawakatsumi
7
4.4k
Xcode Cloud at a glance
kishikawakatsumi
2
800
StoreKit Testingについて
kishikawakatsumi
1
790
Build Swift Web Playground
kishikawakatsumi
1
130
SourceKit-LSPを使ってWebブラウザでSwiftの入力補完を実現する
kishikawakatsumi
1
2.3k
400種類のアプリを毎日ビルドする自動化の技術
kishikawakatsumi
15
7.6k
Featured
See All Featured
Optimizing for Happiness
mojombo
365
63k
Six Lessons from altMBA
skipperchong
14
1.4k
It's Worth the Effort
3n
172
25k
Pencils Down: Stop Designing & Start Developing
hursman
112
9.8k
Rails Girls Zürich Keynote
gr2m
86
12k
From Idea to $5000 a Month in 5 Months
shpigford
373
44k
Building Applications with DynamoDB
mza
83
4.7k
Building Flexible Design Systems
yeseniaperezcruz
310
34k
How To Stay Up To Date on Web Technology
chriscoyier
780
250k
Making the Leap to Tech Lead
cromwellryan
113
7.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
655
120k
Build your cross-platform service in a week with App Engine
jlugia
219
17k
Transcript
Swift Performance
https://github.com/kishikawakatsumi/ kishikawa katsumi http://kishikawakatsumi.hatenablog.com/ Realm
࠷దԽͷલʹ ʮૣ͗͢Δ࠷దԽॾѱͷࠜݯͰ͋Δʯ
࠷దԽͷલʹ ˖ 鎘庠ׅ ˖ չ〳铣䚍պהךزٖ٦سؔؿ ˖ اؿزؐؑ،ךˑٕ٦ٕ˒
ܭଌ͢Δ
ܭଌ͢Δ func measure(call: () -> Void) { let startTime =
CACurrentMediaTime() call() let endTime = CACurrentMediaTime() print("Time - \(endTime - startTime)") }
ܭଌ͢Δ func measure(call: () -> Void) { let startTime =
CACurrentMediaTime() call() let endTime = CACurrentMediaTime() print("Time - \(endTime - startTime)") } measure { // Heavy task }
ίʔυͷੑೳΛ্͛Δʹ ˖ &YQMJDJU ״⸬桦ך葺ְ،ٕ؞ٔؤيח㢌ִ ٍؗحءُ㼪Ⰵׅ ؝٦سך㢌刿չ㣐պ
〳铣䚍הךزٖ٦سؔؿ ˖ *NQMJDJU 鎉铂ך剑黝⻉ⵃ欽ׅ ؝٦سך㢌刿չ㼭պ 鎉铂暴剣
࠷దԽΛ༗ޮʹ͢Δ ˖ 3FMFBTF圓䧭דؽٕسׅ ؝ٝػ؎ٓח״剑黝⻉剣⸬חׅ
࠷దԽΛ༗ޮʹ͢Δ ˖ 3FMFBTF圓䧭דؽٕسׅ ؝ٝػ؎ٓח״剑黝⻉剣⸬חׅ IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU
࠷దԽΛ֬ೝ͢Δʹ $ xcrun swiftc --help OVERVIEW: Swift compiler USAGE: swiftc
[options] <inputs> MODES: -dump-ast Parse and type-check input file(s) and dump AST(s) -dump-parse Parse input file(s) and dump AST(s) -dump-type-refinement-contexts Type-check input file(s) and dump type refinement contexts(s) -emit-assembly Emit assembly file(s) (-S) -emit-bc Emit LLVM BC file(s) -emit-executable Emit a linked executable -emit-ir Emit LLVM IR file(s) ...
࠷దԽΛ֬ೝ͢Δʹ ˖ FNJUBTTFNCMZ&NJUBTTFNCMZMF T 4 ˖ FNJUJS&NJU--7.*3MF T
˖ FNJUTJCHFO&NJUTFSJBMJ[FE"45 SBX4*-MF T ˖ FNJUTJM&NJUDBOPOJDBM4*-MF T
࠷దԽΛ֬ೝ͢Δʹ $ xcrun swiftc -emit-sil sourceFile.swift -o outputFile
finalΛ͏ final class ... final var ... final func ...
privateΛ͏ private class ... private var ... private func ...
finalΛ͏ ˖ ⹛涸ر؍أػحث鼘ֽ ˖ QSJWBUFכ荈⹛涸חOBM䪔ְחז IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU
Reference TypeΑΓValueTypeΛ͏ ˖ *NNVUBCMF ˖ أٖحسإ٦ؿ ˖ ًٌٔ،ٗ؛٦ءّٝ
Reference TypeΑΓValueTypeΛ͏ struct NumberValue { let x: Int } class
NumberReference { let x: Int init(x: Int) { self.x = x } }
Reference TypeΑΓValueTypeΛ͏ ... callq __TFV3out11NumberValueCfMS0_FT1xSi_S0_ movq %rax, -16(%rbp) movq -48(%rbp),
%rdi addq %rax, %rdi ...
Reference TypeΑΓValueTypeΛ͏ ... callq __TFC3out15NumberReferenceCfMS0_FT1xSi_S0_ movq %rax, -32(%rbp) movq -144(%rbp),
%rdi movq %rax, -160(%rbp) callq _swift_release ...
Reference TypeΑΓValueTypeΛ͏ ... callq __TFC3out15NumberReferenceCfMS0_FT1xSi_S0_ movq %rax, -32(%rbp) movq -144(%rbp),
%rdi movq %rax, -160(%rbp) callq _swift_release ...
ReferenceTypeΛྻʹೖΕΔ߹ContiguousArrayΛ͏͜ͱΛݕ౼͢Δ ˖ 3FGFSFODF5ZQFꂁחⰅ㜥さכ$POUJHVPVT"SSBZ⢪ֲֿה嗚 鎢ׅ ྻʹReferece TypeΛ֨ೲ͢ΔͷΛආ͚Δ IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU // Don't use
a class here. struct PhonebookEntry { var name : String var number : [Int] } var a : [PhonebookEntry]
ྻʹReferece TypeΛ֨ೲ͢ΔͷΛආ͚Δ IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU ReferenceTypeΛྻʹೖΕΔ߹ContiguousArrayΛ͏͜ͱΛݕ౼͢Δ ˖ 3FGFSFODF5ZQFꂁחⰅ㜥さכ$POUJHVPVT"SSBZ⢪ֲֿה嗚 鎢ׅ class C {
... } var a: ContiguousArray<C> = [C(...), C(...), ..., C(...)]
Objective-CΛආ͚Δ ˖ ⹛涸ر؍أػحثָ涪欰ׅ ؝ٝػ؎ָٓ剑黝⻉דֹזְ
SwiftͷίʔυΛObjective-Cʹެ։͠ͳ͍ ˖ ⹛涸ر؍أػحثָ涪欰ׅ ؝ٝػ؎ָٓ剑黝⻉דֹזְ
ԆʢLazyʣͤ͞Δ
ඞཁʹԠͯ͡LazyͳมΛ͏ ˖ (MPCBM7BSJBCMFT ˖ 5ZQF7BSJBCMFT ˖ -B[Z1SPQFSUJFT ˖ $PNQVUFE1SPQFSUJFT
LazyCollection let numbers = Array(1...1000) let doubledNumbers = numbers.map {
$0 * 2 } doubledNumbers.last
LazyCollection
LazyCollection let numbers = Array(1...1000) let lazyNumbers = numbers.lazy let
doubledNumbers = lazyNumbers.map { $0 * 2 } doubledNumbers.last let lazyNumbers2 = LazyCollection(numbers) let doubledNumbers2 = lazyNumbers.map { $0 * 2 } doubledNumbers2.last
LazyCollection
ࢀߟࢿྉ HJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU HJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT"3$0QUJNJ[BUJPOSTU 88%$4FTTJPO0QUJNJ[JOH4XJGU1FSGPSNBODF *ODSFBTJOH1FSGPSNBODFCZ3FEVDJOH%ZOBNJD%JTQBUDI
IUUQTEFWFMPQFSBQQMFDPNTXJGUCMPHBSUJDMF