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
160
Running Swift without an OS
kishikawakatsumi
0
990
浮動小数の比較について
kishikawakatsumi
0
610
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
270
愛される翻訳の秘訣
kishikawakatsumi
3
480
Private APIの呼び出し方
kishikawakatsumi
3
1k
iOSでSVG画像を扱う
kishikawakatsumi
0
250
Build your own WebP codec in Swift
kishikawakatsumi
2
2.7k
iOSDC 2024 SMBファイル共有をSwiftで実装する
kishikawakatsumi
1
330
Featured
See All Featured
Evolving SEO for Evolving Search Engines
ryanjones
0
260
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
500
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
260
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
How GitHub (no longer) Works
holman
316
150k
GraphQLとの向き合い方2022年版
quramy
50
15k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
380
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Building AI with AI
inesmontani
PRO
1
1.2k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
470
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
280
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
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