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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
950
浮動小数の比較について
kishikawakatsumi
0
560
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
250
愛される翻訳の秘訣
kishikawakatsumi
3
450
Private APIの呼び出し方
kishikawakatsumi
3
1k
iOSでSVG画像を扱う
kishikawakatsumi
0
240
Build your own WebP codec in Swift
kishikawakatsumi
2
2.3k
iOSDC 2024 SMBファイル共有をSwiftで実装する
kishikawakatsumi
1
330
Featured
See All Featured
Building AI with AI
inesmontani
PRO
1
1.1k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
210
The World Runs on Bad Software
bkeepers
PRO
72
12k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
240
The browser strikes back
jonoalderson
0
1.3k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
240
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Paper Plane
katiecoart
PRO
1
52k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
330
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