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
Swift Performance
Search
Kishikawa Katsumi
February 20, 2016
2k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swift Performance
Swift Optimization Tips
Kishikawa Katsumi
February 20, 2016
More Decks by Kishikawa Katsumi
See All by Kishikawa Katsumi
OCRを使ってゲームのアイテムをデータ化する
kishikawakatsumi
0
150
Running Swift without an OS
kishikawakatsumi
0
960
浮動小数の比較について
kishikawakatsumi
0
580
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
260
愛される翻訳の秘訣
kishikawakatsumi
3
460
Private APIの呼び出し方
kishikawakatsumi
3
1k
iOSでSVG画像を扱う
kishikawakatsumi
0
250
Build your own WebP codec in Swift
kishikawakatsumi
2
2.6k
iOSDC 2024 SMBファイル共有をSwiftで実装する
kishikawakatsumi
1
330
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
540
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.3k
Speed Design
sergeychernyshev
33
1.9k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
890
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
460
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
330
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
840
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
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