Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Swift Performance
Search
Kishikawa Katsumi
February 20, 2016
2.1k
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
Accessibility APIでテキストの内容、位置、サイズを取得する実装パターン
kishikawakatsumi
0
110
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
380
OCRを使ってゲームのアイテムをデータ化する
kishikawakatsumi
0
220
Running Swift without an OS
kishikawakatsumi
0
1.2k
浮動小数の比較について
kishikawakatsumi
0
670
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
290
愛される翻訳の秘訣
kishikawakatsumi
3
520
Private APIの呼び出し方
kishikawakatsumi
3
1.1k
iOSでSVG画像を扱う
kishikawakatsumi
0
280
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Amusing Abliteration
ianozsvald
1
380
Writing Fast Ruby
sferik
630
63k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
480
Code Review Best Practice
trishagee
74
20k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
320
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.6k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
450
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