import Observation struct IconPerfRefreshCycleMetrics { var updateIconsCalls = 0 var renderedCalls = 0 var skippedCalls = 0} extension StatusItemController { func observeIconPerfRefreshCycleChanges() { withObservationTracking { _ = self.store.isRefreshing _ = self.settings.debugLogLevel } onChange: { [weak self] in Task { @MainActor [weak self] in guard let self else { return } self.observeIconPerfRefreshCycleChanges() self.handleIconPerfRefreshCycleChange() } } self.handleIconPerfRefreshCycleChange() } func handleIconPerfRefreshCycleChange() { guard self.settings.isVerboseLoggingEnabled else { self.iconPerfRefreshCycleMetrics = nil self.iconPerfUpdatePassActive = false return } guard !self.store.isRefreshing else { return } self.logIconPerfRefreshCycleIfNeeded() } func beginIconPerfUpdatePass() { self.iconPerfUpdatePassActive = false guard self.settings.isVerboseLoggingEnabled, self.store.isRefreshing else { return } if self.iconPerfRefreshCycleMetrics == nil { self.iconPerfRefreshCycleMetrics = IconPerfRefreshCycleMetrics() } self.iconPerfRefreshCycleMetrics?.updateIconsCalls += 1 self.iconPerfUpdatePassActive = true } func endIconPerfUpdatePass() { self.iconPerfUpdatePassActive = false } func noteIconPerfRender(skipped: Bool) { guard self.iconPerfUpdatePassActive else { return } if skipped { self.iconPerfRefreshCycleMetrics?.skippedCalls += 1 } else { self.iconPerfRefreshCycleMetrics?.renderedCalls += 1 } } func logIconPerfRefreshCycleIfNeeded() { guard let metrics = self.iconPerfRefreshCycleMetrics, metrics.updateIconsCalls > 0 else { self.iconPerfRefreshCycleMetrics = nil return } let message = "[perf] refresh cycle: updateIcons() called \(metrics.updateIconsCalls) times " + "(\(metrics.renderedCalls) rendered, \(metrics.skippedCalls) skipped)" self.menuLogger.verbose(message) self.iconPerfRefreshCycleMetrics = nil }}
import Observation
struct IconPerfRefreshCycleMetrics {
var updateIconsCalls = 0
var renderedCalls = 0
var skippedCalls = 0
}
extension StatusItemController {
func observeIconPerfRefreshCycleChanges() {
withObservationTracking {
_ = self.store.isRefreshing
_ = self.settings.debugLogLevel
} onChange: { [weak self] in
Task { @MainActor [weak self] in
guard let self else { return }
self.observeIconPerfRefreshCycleChanges()
self.handleIconPerfRefreshCycleChange()
}
}
self.handleIconPerfRefreshCycleChange()
}
func handleIconPerfRefreshCycleChange() {
guard self.settings.isVerboseLoggingEnabled else {
self.iconPerfRefreshCycleMetrics = nil
self.iconPerfUpdatePassActive = false
return
}
guard !self.store.isRefreshing else { return }
self.logIconPerfRefreshCycleIfNeeded()
}
func beginIconPerfUpdatePass() {
self.iconPerfUpdatePassActive = false
guard self.settings.isVerboseLoggingEnabled, self.store.isRefreshing else { return }
if self.iconPerfRefreshCycleMetrics == nil {
self.iconPerfRefreshCycleMetrics = IconPerfRefreshCycleMetrics()
}
self.iconPerfRefreshCycleMetrics?.updateIconsCalls += 1
self.iconPerfUpdatePassActive = true
}
func endIconPerfUpdatePass() {
self.iconPerfUpdatePassActive = false
}
func noteIconPerfRender(skipped: Bool) {
guard self.iconPerfUpdatePassActive else { return }
if skipped {
self.iconPerfRefreshCycleMetrics?.skippedCalls += 1
} else {
self.iconPerfRefreshCycleMetrics?.renderedCalls += 1
}
}
func logIconPerfRefreshCycleIfNeeded() {
guard let metrics = self.iconPerfRefreshCycleMetrics,
metrics.updateIconsCalls > 0
else {
self.iconPerfRefreshCycleMetrics = nil
return
}
let message = "[perf] refresh cycle: updateIcons() called \(metrics.updateIconsCalls) times "
+ "(\(metrics.renderedCalls) rendered, \(metrics.skippedCalls) skipped)"
self.menuLogger.verbose(message)
self.iconPerfRefreshCycleMetrics = nil
}
}