From 4f480a082a39ccac57932e25cced3c2c418f1d2d Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Sat, 13 Aug 2022 17:48:54 +0200 Subject: [PATCH] feat: show efficiency and performance cores usage in the popup view (#863) --- Modules/CPU/main.swift | 2 ++ Modules/CPU/popup.swift | 27 +++++++++++++++++++++++++-- Modules/CPU/readers.swift | 20 ++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Modules/CPU/main.swift b/Modules/CPU/main.swift index 02a243c9..d6db7945 100644 --- a/Modules/CPU/main.swift +++ b/Modules/CPU/main.swift @@ -12,6 +12,8 @@ import Kit public struct CPU_Load: value_t { var totalUsage: Double = 0 var usagePerCore: [Double] = [] + var usageECores: Double? = nil + var usagePCores: Double? = nil var systemLoad: Double = 0 var userLoad: Double = 0 diff --git a/Modules/CPU/popup.swift b/Modules/CPU/popup.swift index 71728eeb..62e18b3d 100644 --- a/Modules/CPU/popup.swift +++ b/Modules/CPU/popup.swift @@ -21,10 +21,17 @@ internal class Popup: NSView, Popup_p { private let chartHeight: CGFloat = 90 + Constants.Popup.separatorHeight private var detailsHeight: CGFloat { get { + var count: CGFloat = 5 if isARM { - return (22*3) + Constants.Popup.separatorHeight + count = 3 } - return (22*5) + Constants.Popup.separatorHeight + if SystemKit.shared.device.info.cpu?.eCores != nil { + count += 1 + } + if SystemKit.shared.device.info.cpu?.pCores != nil { + count += 1 + } + return (22*count) + Constants.Popup.separatorHeight } } private let averageHeight: CGFloat = (22*3) + Constants.Popup.separatorHeight @@ -35,6 +42,8 @@ internal class Popup: NSView, Popup_p { private var idleField: NSTextField? = nil private var shedulerLimitField: NSTextField? = nil private var speedLimitField: NSTextField? = nil + private var eCoresField: NSTextField? = nil + private var pCoresField: NSTextField? = nil private var average1Field: NSTextField? = nil private var average5Field: NSTextField? = nil private var average15Field: NSTextField? = nil @@ -192,6 +201,13 @@ internal class Popup: NSView, Popup_p { self.speedLimitField = popupRow(container, n: 0, title: "\(localizedString("Speed limit")):", value: "").1 } + if SystemKit.shared.device.info.cpu?.eCores != nil { + self.eCoresField = popupRow(container, n: 0, title: "\(localizedString("E-cores")):", value: "").1 + } + if SystemKit.shared.device.info.cpu?.pCores != nil { + self.pCoresField = popupRow(container, n: 0, title: "\(localizedString("P-cores")):", value: "").1 + } + view.addSubview(separator) view.addSubview(container) @@ -245,6 +261,13 @@ internal class Popup: NSView, Popup_p { circle_segment(value: value.userLoad, color: NSColor.systemBlue) ]) + if let field = self.eCoresField, let usage = value.usageECores { + field.stringValue = "\(Int(usage * 100))%" + } + if let field = self.pCoresField, let usage = value.usagePCores { + field.stringValue = "\(Int(usage * 100))%" + } + self.initialized = true } self.chart?.addValue(value.totalUsage) diff --git a/Modules/CPU/readers.swift b/Modules/CPU/readers.swift index a41b7567..40496beb 100644 --- a/Modules/CPU/readers.swift +++ b/Modules/CPU/readers.swift @@ -25,6 +25,7 @@ internal class LoadReader: Reader { private var response: CPU_Load = CPU_Load() private var numCPUsU: natural_t = 0 private var usagePerCore: [Double] = [] + private var cores: [core_s]? = nil public override func setup() { self.hasHyperthreadingCores = sysctlByName("hw.physicalcpu") != sysctlByName("hw.logicalcpu") @@ -35,6 +36,7 @@ internal class LoadReader: Reader { self.numCPUs = 1 } } + self.cores = SystemKit.shared.device.info.cpu?.cores } public override func read() { @@ -127,6 +129,24 @@ internal class LoadReader: Reader { self.previousInfo = cpuInfo! self.response.totalUsage = self.response.systemLoad + self.response.userLoad + if let cores = self.cores { + let eCoresList: [Double] = cores.filter({ $0.type == .efficiency }).compactMap { (c: core_s) in + if self.response.usagePerCore.indices.contains(Int(c.id)) { + return self.response.usagePerCore[Int(c.id)] + } + return 0 + } + let pCoresList: [Double] = cores.filter({ $0.type == .performance }).compactMap { (c: core_s) in + if self.response.usagePerCore.indices.contains(Int(c.id)) { + return self.response.usagePerCore[Int(c.id)] + } + return 0 + } + + self.response.usageECores = eCoresList.reduce(0, +)/Double(cores.count) + self.response.usagePCores = pCoresList.reduce(0, +)/Double(cores.count) + } + self.callback(self.response) }