ROPPONGI.swift 第4回 WWDC振り返り会(VISITS・Origami共催) - connpass https://visits.connpass.com/event/90254/ の発表資料です。
# 参考リンク
Measuring Performance Using Logging - WWDC 2018 - Videos - Apple Developer https://developer.apple.com/videos/play/wwdc2018/405/
Measuring PerformanceUsing Loggingby.2018/6/19 Roppongi.swift1
View Slide
takasek@takasekWorksOSS: ActionClosurableApp: PasteTheTypeArticlesʮίϯύΠϧΤϥʔϥϯλΠϜΤϥʔΛ͍͚ͯͩ͘͠ͰiOSΞϓϦͷ࡞Γํ͕Θ͔ΔϓϩδΣΫτʯʮ͓લΒ͕ModelͱݺͿΞϨΛͳΜͱݺͿ͖͔ʯ!ʮiOSΞϓϦઃܭύλʔϯೖʯʢڞஶʣ2
os_log3
os_logWWDC2016͔Βಋೖ͞Εͨlet logHandle = OSLog(subsystem: "com.example.widget",category: "Setup")os_log(.info, log: logHandle,"Hello, %{public}s!",world)4
signpost5
signpost• os_log family• InstrumentsͰύϑΥʔϚϯεܭଌʹ͑ΔΑ͏ʹ֦ு• ͍ܰ6
ϧʔϓॲཧͷ࣌ؒΛܭଌ͍ͨ͠7
for element in panel.elements {fetchAsset(for: element)}8
import os.signpostfor element in panel.elements {fetchAsset(for: element)}9
import os.signpostlet refreshLog = OSLog( //!subsystem: "com.example.your-app",category: "RefreshOperations")for element in panel.elements {fetchAsset(for: element)}10
import os.signpostlet 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
ॲཧશମͷ࣌ؒΛܭଌ͍ͨ͠12
for element in panel.elements {os_signpost(type: .begin, log: refreshLog, name: " ")fetchAsset(for: element)os_signpost(type: .end, log: refreshLog, name: " ")}13
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
ඇಉظॲཧʹ͍ͨ͠!͕ಉ࣌ʹΔ͜ͱ͋Δ…15
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
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
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
Example RepresentsLog category "RefreshOperations"ؔ࿈͢Δॲཧͷ·ͱ·ΓSignpost name "!" ܭଌରSignpost ID "! ܭଌ͢Δॲཧͻͱͭͻͱͭ19
ϝλσʔλΛೖΕ͍ͨ20
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
୯ൃΠϕϯτΛه͍ͨ͠22
os_signpost(.event, log: log, name: "Swipe","For action 0x%x", actionCode)23
ϩάΛoffʹ͍ͨ͠24
let refreshLog: OSLogif ProcessInfo.processInfo.environment.keys.contains("SIGNPOSTS_FOR_REFRESH") {refreshLog = OSLog(subsystem: "com.example.your-app",category: "RefreshOperations")} else {refreshLog = .disabled}25
ϩάͷͨΊʹίετͷ͔͔ΔॲཧΛ͍ͯ͠Δ߹…if refreshLog.signpostsEnabled {let information = copyDescription()os_signpost(..., information)}26
Instruments27
• Instruments → Blank → [+] → "os_signpost" ͰϑΟϧλ• signposts͕֬ೝͰ͖Δʢ˞࣮ػͰಈ͔͢͜ͱʣ• Time Profiler• ͰΠϕϯτΛ֬ೝͰ͖ΔOSLog͋Δ• OSLog(subsystem: ..., category: .pointsOfInterest) ʹ.event ΛૹΔ• Custom Instruments• ϏδϡΞϥΠζͷํ๏ΛΧελϚΠζͰ͖Δ• ʮnඵҎ্͔͔͍ͬͯΔॲཧΛ͘දࣔ͢Δʯͱ͔28
·ͱΊsignpostsͰίʔυΛΞϊςʔτ͠Α͏• ؆୯ʹॲཧͷϧʔϓΛϩάͰ͖Δ• ϝλσʔλؚΊΒΕΔInstrumentsͰ֬ೝ͠Α͏• ॲཧ࣌ؒΛϏδϡΞϥΠζͰ͖Δ• ϓϩάϥϜ͕ԿΛ͍ͯ͠Δ͔Θ͔Δ29
Refer toMeasuring Performance Using Logginghttps://developer.apple.com/videos/play/wwdc2018/405/• ͜ͷࢿྉʢ΄΅ʣηογϣϯͷҾ͖ࣸ͠Ͱ͢• InstrumentsͷσϞTipsॆ࣮ͯͯ͠ඞݟ• ͱ͍͏Θ͚ͰݩηογϣϯΛݟ·͠ΐ͏30