Slide 1

Slide 1 text

Swift Performance

Slide 2

Slide 2 text

https://github.com/kishikawakatsumi/ kishikawa katsumi http://kishikawakatsumi.hatenablog.com/ Realm

Slide 3

Slide 3 text

࠷దԽͷલʹ ʮૣ͗͢Δ࠷దԽ͸ॾѱͷࠜݯͰ͋Δʯ

Slide 4

Slide 4 text

࠷దԽͷલʹ ˖ 鎘庠ׅ׷ ˖ չ〳铣䚍պהךزٖ٦سؔؿ ˖ اؿزؐؑ،ךˑٕ٦ٕ˒

Slide 5

Slide 5 text

ܭଌ͢Δ

Slide 6

Slide 6 text

ܭଌ͢Δ func measure(call: () -> Void) { let startTime = CACurrentMediaTime() call() let endTime = CACurrentMediaTime() print("Time - \(endTime - startTime)") }

Slide 7

Slide 7 text

ܭଌ͢Δ func measure(call: () -> Void) { let startTime = CACurrentMediaTime() call() let endTime = CACurrentMediaTime() print("Time - \(endTime - startTime)") } measure { // Heavy task }

Slide 8

Slide 8 text

ίʔυͷੑೳΛ্͛Δʹ͸ ˖ &YQMJDJU  ״׶⸬桦ך葺ְ،ٕ؞ٔؤيח㢌ִ׷  ٍؗحءُ׾㼪Ⰵׅ׷  ؝٦سך㢌刿չ㣐պ  〳铣䚍הךزٖ٦سؔؿ ˖ *NQMJDJU  鎉铂ך剑黝⻉׾ⵃ欽ׅ׷  ؝٦سך㢌刿չ㼭պ  鎉铂暴剣

Slide 9

Slide 9 text

࠷దԽΛ༗ޮʹ͢Δ ˖ 3FMFBTF圓䧭דؽٕسׅ׷  ؝ٝػ؎ٓח״׷剑黝⻉׾剣⸬חׅ׷

Slide 10

Slide 10 text

࠷దԽΛ༗ޮʹ͢Δ ˖ 3FMFBTF圓䧭דؽٕسׅ׷  ؝ٝػ؎ٓח״׷剑黝⻉׾剣⸬חׅ׷ IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU

Slide 11

Slide 11 text

࠷దԽΛ֬ೝ͢Δʹ͸ $ xcrun swiftc --help OVERVIEW: Swift compiler USAGE: swiftc [options] 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) ...

Slide 12

Slide 12 text

࠷దԽΛ֬ೝ͢Δʹ͸ ˖ FNJUBTTFNCMZ&NJUBTTFNCMZMF T  4  ˖ FNJUJS&NJU--7.*3MF T  ˖ FNJUTJCHFO&NJUTFSJBMJ[FE"45 SBX4*-MF T  ˖ FNJUTJM&NJUDBOPOJDBM4*-MF T

Slide 13

Slide 13 text

࠷దԽΛ֬ೝ͢Δʹ͸ $ xcrun swiftc -emit-sil sourceFile.swift -o outputFile

Slide 14

Slide 14 text

finalΛ࢖͏ final class ... final var ... final func ...

Slide 15

Slide 15 text

privateΛ࢖͏ private class ... private var ... private func ...

Slide 16

Slide 16 text

finalΛ࢖͏ ˖ ⹛涸ر؍أػحث׾鼘ֽ׷ ˖ QSJWBUFכ荈⹛涸חOBM䪔ְחז׷ IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU

Slide 17

Slide 17 text

Reference TypeΑΓValueTypeΛ࢖͏ ˖ *NNVUBCMF ˖ أٖحسإ٦ؿ ˖ ًٌٔ،ٗ؛٦ءّٝ

Slide 18

Slide 18 text

Reference TypeΑΓValueTypeΛ࢖͏ struct NumberValue { let x: Int } class NumberReference { let x: Int init(x: Int) { self.x = x } }

Slide 19

Slide 19 text

Reference TypeΑΓValueTypeΛ࢖͏ ... callq __TFV3out11NumberValueCfMS0_FT1xSi_S0_ movq %rax, -16(%rbp) movq -48(%rbp), %rdi addq %rax, %rdi ...

Slide 20

Slide 20 text

Reference TypeΑΓValueTypeΛ࢖͏ ... callq __TFC3out15NumberReferenceCfMS0_FT1xSi_S0_ movq %rax, -32(%rbp) movq -144(%rbp), %rdi movq %rax, -160(%rbp) callq _swift_release ...

Slide 21

Slide 21 text

Reference TypeΑΓValueTypeΛ࢖͏ ... callq __TFC3out15NumberReferenceCfMS0_FT1xSi_S0_ movq %rax, -32(%rbp) movq -144(%rbp), %rdi movq %rax, -160(%rbp) callq _swift_release ...

Slide 22

Slide 22 text

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]

Slide 23

Slide 23 text

഑ྻʹReferece TypeΛ֨ೲ͢ΔͷΛආ͚Δ IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU ReferenceTypeΛ഑ྻʹೖΕΔ৔߹͸ContiguousArrayΛ࢖͏͜ͱΛݕ౼͢Δ ˖ 3FGFSFODF5ZQF׾ꂁ⴨חⰅ׸׷㜥さכ$POUJHVPVT"SSBZ׾⢪ֲֿה׾嗚 鎢ׅ׷ class C { ... } var a: ContiguousArray = [C(...), C(...), ..., C(...)]

Slide 24

Slide 24 text

Objective-CΛආ͚Δ ˖ ⹛涸ر؍أػحثָ涪欰ׅ׷  ؝ٝػ؎ָٓ剑黝⻉דֹזְ

Slide 25

Slide 25 text

SwiftͷίʔυΛObjective-Cʹެ։͠ͳ͍ ˖ ⹛涸ر؍أػحثָ涪欰ׅ׷  ؝ٝػ؎ָٓ剑黝⻉דֹזְ

Slide 26

Slide 26 text

஗ԆʢLazyʣͤ͞Δ

Slide 27

Slide 27 text

ඞཁʹԠͯ͡Lazyͳม਺Λ࢖͏ ˖ (MPCBM7BSJBCMFT ˖ 5ZQF7BSJBCMFT ˖ -B[Z1SPQFSUJFT ˖ $PNQVUFE1SPQFSUJFT

Slide 28

Slide 28 text

LazyCollection let numbers = Array(1...1000) let doubledNumbers = numbers.map { $0 * 2 } doubledNumbers.last

Slide 29

Slide 29 text

LazyCollection

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

LazyCollection

Slide 32

Slide 32 text

ࢀߟࢿྉ  HJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT0QUJNJ[BUJPO5JQTSTU  HJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT"3$0QUJNJ[BUJPOSTU  88%$4FTTJPO0QUJNJ[JOH4XJGU1FSGPSNBODF  *ODSFBTJOH1FSGPSNBODFCZ3FEVDJOH%ZOBNJD%JTQBUDI  IUUQTEFWFMPQFSBQQMFDPNTXJGUCMPHBSUJDMF