Slide 1

Slide 1 text

Measuring Performance Using Logging by. 2018/6/19 Roppongi.swift 1

Slide 2

Slide 2 text

takasek @takasek Works OSS: ActionClosurable౳ App: PasteTheType Articles ʮίϯύΠϧΤϥʔ΍ϥϯλΠϜΤϥʔΛ௚͍ͯ͘͠ ͚ͩͰiOSΞϓϦͷ࡞Γํ͕Θ͔ΔϓϩδΣΫτʯ ʮ͓લΒ͕ModelͱݺͿΞϨΛͳΜͱݺͿ΂͖͔ʯ ! ʮiOSΞϓϦઃܭύλʔϯೖ໳ʯʢڞஶʣ 2

Slide 3

Slide 3 text

os_log 3

Slide 4

Slide 4 text

os_log WWDC2016͔Βಋೖ͞Εͨ let logHandle = OSLog( subsystem: "com.example.widget", category: "Setup" ) os_log(.info, log: logHandle, "Hello, %{public}s!", world ) 4

Slide 5

Slide 5 text

signpost 5

Slide 6

Slide 6 text

signpost • os_log family • InstrumentsͰύϑΥʔϚϯεܭଌʹ࢖͑ΔΑ͏ʹ֦ு • ͍ܰ 6

Slide 7

Slide 7 text

ϧʔϓॲཧͷ࣌ؒΛ ܭଌ͍ͨ͠ 7

Slide 8

Slide 8 text

for element in panel.elements { fetchAsset(for: element) } 8

Slide 9

Slide 9 text

import os.signpost for element in panel.elements { fetchAsset(for: element) } 9

Slide 10

Slide 10 text

import os.signpost let refreshLog = OSLog( // ! subsystem: "com.example.your-app", category: "RefreshOperations" ) for element in panel.elements { fetchAsset(for: element) } 10

Slide 11

Slide 11 text

import os.signpost let refreshLog = OSLog( subsystem: "com.example.your-app", category: "RefreshOperations" ) for element in panel.elements { os_signpost(type: .begin, log: refreshLog, // name: " " ") fetchAsset(for: element) os_signpost(type: .end, log: refreshLog, // name: " " ") } 11

Slide 12

Slide 12 text

ॲཧશମͷ࣌ؒΛ ܭଌ͍ͨ͠ 12

Slide 13

Slide 13 text

for element in panel.elements { os_signpost(type: .begin, log: refreshLog, name: " ") fetchAsset(for: element) os_signpost(type: .end, log: refreshLog, name: " ") } 13

Slide 14

Slide 14 text

os_signpost(type: .begin, log: refreshLog, name: " ") // for element in panel.elements { os_signpost(type: .begin, log: refreshLog, name: " ") fetchAsset(for: element) os_signpost(type: .end, log: refreshLog, name: " ") } os_signpost(type: .end, log: refreshLog, name: " ") // 14

Slide 15

Slide 15 text

ඇಉظॲཧʹ͍ͨ͠ ! ͕ಉ࣌ʹ૸Δ͜ͱ΋͋Δ… 15

Slide 16

Slide 16 text

os_signpost(type: .begin, log: refreshLog, name: " ") for element in panel.elements { os_signpost(type: .begin, log: refreshLog, name: " ") fetchAssetAsync(for: element) { os_signpost(type: .end, log: refreshLog, name: " ") } } notifyWhenDone { os_signpost(type: .end, log: refreshLog, name: " ") } 16

Slide 17

Slide 17 text

let !♻ = OSSignpostID(log: refreshLog) // os_signpost(type: .begin, log: refreshLog, name: " ") for element in panel.elements { let !$ = OSSignpostID(log: refreshLog, object: element) // os_signpost(type: .begin, log: refreshLog, name: " ") fetchAssetAsync(for: element) { os_signpost(type: .end, log: refreshLog, name: " ") } } notifyWhenDone { os_signpost(type: .end, log: refreshLog, name: " ") } 17

Slide 18

Slide 18 text

let !♻ = OSSignpostID(log: refreshLog) os_signpost(type: .begin, log: refreshLog, name: " ", signpostID: !♻ ) // # for element in panel.elements { let !$ = OSSignpostID(log: refreshLog, object: element) os_signpost(type: .begin, log: refreshLog, name: " ", signpostID: !$ ) // # fetchAssetAsync(for: element) { os_signpost(type: .end, log: refreshLog, name: " ", signpostID: !$ ) // # } } notifyWhenDone { os_signpost(type: .end, log: refreshLog, name: " ", signpostID: !♻ ) // # } 18

Slide 19

Slide 19 text

Example Represents Log category "RefreshOperatio ns" ؔ࿈͢Δॲཧͷ ·ͱ·Γ Signpost name "!" ܭଌର৅ Signpost ID "! ܭଌ͢Δॲཧ ͻͱͭͻͱͭ 19

Slide 20

Slide 20 text

ϝλσʔλΛ ೖΕ͍ͨ 20

Slide 21

Slide 21 text

os_signpost( type: .begin, log: log, name: "Compute Physics", "for %{public}@ at (%.1f, %.1f)" + "with mass %.2f and velocity (%.1f, %.1f)", description, x1, y1, m, x2, y2 ) • %.1f , %.2f , %d ... • %{public}@ • %{xcode:size-in-bytes}llu • Instrumentsʹ෼ੳσʔλͱͯ͠ೝࣝͤ͞Δ 21

Slide 22

Slide 22 text

୯ൃΠϕϯτΛ ه࿥͍ͨ͠ 22

Slide 23

Slide 23 text

os_signpost( .event, log: log, name: "Swipe", "For action 0x%x", actionCode ) 23

Slide 24

Slide 24 text

ϩάΛoffʹ͍ͨ͠ 24

Slide 25

Slide 25 text

let refreshLog: OSLog if ProcessInfo.processInfo.environment.keys.contains("SIGNPOSTS_FOR_REFRESH") { refreshLog = OSLog( subsystem: "com.example.your-app", category: "RefreshOperations" ) } else { refreshLog = .disabled } 25

Slide 26

Slide 26 text

ϩάͷͨΊʹίετͷ͔͔ΔॲཧΛ͍ͯ͠Δ৔߹… if refreshLog.signpostsEnabled { let information = copyDescription() os_signpost(..., information) } 26

Slide 27

Slide 27 text

Instruments 27

Slide 28

Slide 28 text

• Instruments → Blank → [+] → "os_signpost" ͰϑΟϧλ • signposts͕֬ೝͰ͖Δʢ˞࣮ػͰಈ͔͢͜ͱʣ • Time Profiler • ͰΠϕϯτΛ֬ೝͰ͖ΔOSLog΋͋Δ • OSLog(subsystem: ..., category: .pointsOfInterest) ʹ .event ΛૹΔ • Custom Instruments • ϏδϡΞϥΠζͷํ๏ΛΧελϚΠζͰ͖Δ • ʮnඵҎ্͔͔͍ͬͯΔॲཧΛ੺͘දࣔ͢Δʯͱ͔ 28

Slide 29

Slide 29 text

·ͱΊ signpostsͰίʔυΛΞϊςʔτ͠Α͏ • ؆୯ʹॲཧͷϧʔϓΛϩάͰ͖Δ • ϝλσʔλ΋ؚΊΒΕΔ InstrumentsͰ֬ೝ͠Α͏ • ॲཧ࣌ؒΛϏδϡΞϥΠζͰ͖Δ • ϓϩάϥϜ͕ԿΛ͍ͯ͠Δ͔Θ͔Δ 29

Slide 30

Slide 30 text

Refer to Measuring Performance Using Logging https://developer.apple.com/videos/play/ wwdc2018/405/ • ͜ͷࢿྉ͸ʢ΄΅ʣηογϣϯͷҾ͖ࣸ͠Ͱ͢ • InstrumentsͷσϞ͸Tips΋ॆ࣮ͯͯ͠ඞݟ • ͱ͍͏Θ͚ͰݩηογϣϯΛݟ·͠ΐ͏ 30