Slide 1

Slide 1 text

class func v. static func ͔ͨͶ

Slide 2

Slide 2 text

About me • ໊ݹ԰Ͱ৽ଔSE • དྷ݄͔Βస৬ɼ౦ژͰiOS։ൃ • Rx͸ྑ͍ͧ • Clean Architectureྑ͍͔΋

Slide 3

Slide 3 text

class func v. static func

Slide 4

Slide 4 text

ػೳͷൺֱ class static override class struct enum

Slide 5

Slide 5 text

class಺ൺֱ class static override class struct enum

Slide 6

Slide 6 text

ݕূ $ swiftc -v Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.37.1) Target: x86_64-apple-darwin17.5.0

Slide 7

Slide 7 text

class func v. static func

Slide 8

Slide 8 text

SILͷੜ੒ $ swiftc -emit-silgen class-func.swift > class-func.sil $ swiftc -emit-silgen static-func.swift > static-func.sil ΞηϯϒϦੜ੒͸ɼ͜͏ɻ $ swiftc -emit-assembly class-func.swift > class-func.s $ swiftc -emit-assembly static-func.swift > static-func.s

Slide 9

Slide 9 text

$ diff class-func.sil static-func.sil ※1 @@ -7,8 +7,9 @@ import SwiftShims // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer>>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer>>): - %2 = metatype $@thick Main.Type // users: %4, %3 - %3 = class_method %2 : $@thick Main.Type, #Main.say!1 : (Main.Type) -> () -> (), $@convention(method) (@thick Main.Typ () // user: %4 + %2 = metatype $@thick Main.Type // user: %4 + // function_ref static Main.say() + %3 = function_ref @_T04main4MainC3sayyyFZ : $@convention(method) (@thick Main.Type) -> () // user: %4 %4 = apply %3(%2) : $@convention(method) (@thick Main.Type) -> () %5 = integer_literal $Builtin.Int32, 0 // user: %6 %6 = struct $Int32 (%5 : $Builtin.Int32) // user: %7 @@ -117,7 +118,6 @@ bb0(%0 : $Main): } // end sil function '_T04main4MainCACycfc' sil_vtable Main { - #Main.say!1: (Main.Type) -> () -> () : _T04main4MainC3sayyyFZ // static Main.say() #Main.init!initializer.1: (Main.Type) -> () -> Main : _T04main4MainCACycfc // Main.init() #Main.deinit!deallocator: _T04main4MainCfD // Main.__deallocating_deinit } ※1: લޙͷίʔυΛදࣔͤ͞ΔͨΊɼdiffʹ͸gitΛར༻͍ͯ͠·͢ɻ

Slide 10

Slide 10 text

$ diff class-func.sil static-func.sil ※1 @@ -7,8 +7,9 @@ import SwiftShims // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer>>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer>>): - %2 = metatype $@thick Main.Type // users: %4, %3 - %3 = class_method %2 : $@thick Main.Type, #Main.say!1 : (Main.Type) -> () -> (), $@convention(method) (@thick Main.Typ () // user: %4 + %2 = metatype $@thick Main.Type // user: %4 + // function_ref static Main.say() + %3 = function_ref @_T04main4MainC3sayyyFZ : $@convention(method) (@thick Main.Type) -> () // user: %4 %4 = apply %3(%2) : $@convention(method) (@thick Main.Type) -> () %5 = integer_literal $Builtin.Int32, 0 // user: %6 %6 = struct $Int32 (%5 : $Builtin.Int32) // user: %7 @@ -117,7 +118,6 @@ bb0(%0 : $Main): } // end sil function '_T04main4MainCACycfc' sil_vtable Main { - #Main.say!1: (Main.Type) -> () -> () : _T04main4MainC3sayyyFZ // static Main.say() #Main.init!initializer.1: (Main.Type) -> () -> Main : _T04main4MainCACycfc // Main.init() #Main.deinit!deallocator: _T04main4MainCfD // Main.__deallocating_deinit } class_method function_ref ※1: લޙͷίʔυΛදࣔͤ͞ΔͨΊɼdiffʹ͸gitΛར༻͍ͯ͠·͢ɻ

Slide 11

Slide 11 text

Կ͕ى͍ͬͯ͜Δͷ͔ •class func • sil_vtableʹϝιουΛొ࿥ • ࢖༻࣌ʹಈతσΟεύον •static func • generic function͔Β௚઀ݺͼग़͠ class_method function_ref

Slide 12

Slide 12 text

static func൒୺ͳ͍ͬͯɻ ͍͋ͭ൒୺ͳ͍ͬͯɻ ௚઀ݺͼग़͢͠Δ΋Μɻ ͦΜͳΜͰ͖ͻΜ΍Μɼී௨ɻ

Slide 13

Slide 13 text

ී௨ɼ͸Ͱ͖ͳ͍ɻ

Slide 14

Slide 14 text

class಺ൺֱ class static override class struct enum

Slide 15

Slide 15 text

class಺ൺֱ class static override class struct enum final Ͱېࢭͨ͠৔߹͸ಉҰ?

Slide 16

Slide 16 text

ௐ΂ͯΈΔ

Slide 17

Slide 17 text

ௐ΂ͯΈΔ What is the difference between static func and class func in Swift? Swiftͷclass funcͱstatic funcͷҧ͍ static func is same as final class func static func ͸ final class func ͱಉٛ

Slide 18

Slide 18 text

ݕূ $ swiftc -v Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.37.1) Target: x86_64-apple-darwin17.5.0

Slide 19

Slide 19 text

final class func v. static func

Slide 20

Slide 20 text

SILͷੜ੒ $ swiftc -emit-silgen \ final-class-func.swift > final-class-func.sil $ swiftc -emit-silgen static-func.swift > static-func.sil ΞηϯϒϦੜ੒͸ɼ͜͏ɻ $ swiftc -emit-assembly \ final-class-func.swift > final-class-func.s $ swiftc -emit-assembly static-func.swift > static-func.s

Slide 21

Slide 21 text

$ diff final-class-func.sil static-func.sil (There is no difference)

Slide 22

Slide 22 text

͓·͚

Slide 23

Slide 23 text

XcodebuildͰͷϏϧυ $ xcrun swiftc -Onone class-func.swift $ xcrun swiftc -Onone final-class-func.swift $ xcrun swiftc -Onone static-func.swift $ xcrun swiftc -wmo -O class-func.swift $ xcrun swiftc -wmo -O final-class-func.swift $ xcrun swiftc -wmo -O static-func.swift ࠷దԽͳ͠ ϦϦʔεϏϧυ

Slide 24

Slide 24 text

Assemblyൺֱ

Slide 25

Slide 25 text

db, ddχʔϞχοΫʹΑΔม਺એݴʹͷΈ͕ࠩΈΒΕͨɻ final classͱstatic classؒͰ͸શ͘ಉҰͷίʔυ͕ੜ੒͞Εͨɻ

Slide 26

Slide 26 text

·ͱΊ !

Slide 27

Slide 27 text

·ͱΊ • 同一条件 (class内) の場合,動作速度はclass func > static func。※ • (class内では) final class funcとstatic funcは同一。 • Xcodebuildを利用すると,コンパイラによりclass funcと static funcは同一のバイナリを出力する。

Slide 28

Slide 28 text

ࢀߟ ຊεϥΠυ͸ɼQiitaهࣄ class func v. static func in Swift4 ͱಉҰͷ಺༰Ͱ͢ɻ What is the difference between static func and class func in Swift? - Stack Overflow Swiftͷclass funcͱstatic funcͷҧ͍ ʲSwiftʳclassͱstaticͷڍಈͷҧ͍Λ੔ཧ͢Δ - Qiita Merge pull request #15151 from ikesyo/stdlib-public-operator-static-func - GitHub apple/swift Swift ؔ਺ͷ࠶ؼݺͼग़͠͸࠷దԽ͞Ε͍ͯΔ͔ LLVM - dev.classmethod.jp Swift Intermediate Language (SIL) - GitHub apple/swift [Swift]ಈతσΟεύονΛݮΒ͢͜ͱͰύϑΥʔϚϯεΛվળ class func vs static func - Reddit Taming Swift compiler bugs Swift࣮ߦϑΝΠϧΛٯΞηϯϒϧͯ͠ɼ࠷దԽ۩߹Λਖ਼֬ʹ೺Ѳ͢Δํ๏ - Qiita Swiftͷfinalʹ͍ͭͯ - Qiita SwiftͷfinalɾprivateɾWhole Module OptimizationΛཧղ͠Dynamic DispatchΛݮΒͯ͠ɼύϑΥʔϚϯεΛ޲্͢Δ - Qiita Increasing Performance by Reducing Dynamic Dispatch - developer.apple.com/swift Writing High-Performance Swift Code - GitHub apple/swift Swift Compiler Performance - GitHub apple/swift vtableͷத਎ΛݟͯΈΔ Ծ૝ؔ਺ςʔϒϧ - wikipedia LLVM Programmer’s Manual ϏϡʔςΟϑϧΞʔΩςΫνϟ RubyͰͷϝλϓϩάϥϛϯάʢಈతσΟεύονͱಈతϝιουʣ