🍁
Swift: M1 MacのGPU使用率を取得する
内蔵GPUについて。外付けGPUだともう一工夫必要。
とりあえずソースだけ貼る。
import Foundation
import IOKit
func fetchIOService(_ name: String) -> [[String : AnyObject]] {
var result: [[String : AnyObject]] = []
let serviceMatching = IOServiceMatching(name)
var iterator = io_iterator_t()
if IOServiceGetMatchingServices(kIOMasterPortDefault, serviceMatching, &iterator) == kIOReturnSuccess {
while case let regEntry = IOIteratorNext(iterator), regEntry != 0 {
var services: Unmanaged<CFMutableDictionary>? = nil
if IORegistryEntryCreateCFProperties(regEntry, &services, kCFAllocatorDefault, 0) == kIOReturnSuccess {
guard let servicesDict = services?.takeUnretainedValue() as? [String : AnyObject] else { continue }
services?.release()
result.append(servicesDict)
}
IOObjectRelease(regEntry)
}
IOObjectRelease(iterator)
}
return result
}
let accelerators = fetchIOService(kIOAcceleratorClassName)
accelerators.forEach { dict in
if let c = dict["IOClass"] as? String {
if c.lowercased().contains("agx") {
Swift.print("Apple Graphics: \(c)")
} else {
Swift.print("Graphics: \(c)")
}
}
if let ps = dict["PerformanceStatistics"] as? [String : AnyObject] {
if let v = ps["Device Utilization %"] as? Int {
Swift.print("GPU: \(v)%")
}
if let v = ps["Renderer Utilization %"] as? Int {
Swift.print("Renderer: \(v)%")
}
if let v = ps["Tiler Utilization %"] as? Int {
Swift.print("Tiler: \(v)%")
}
}
}
Discussion