按需获取CPU使用率的Swift脚本返回固定值问题求助
解决单次调用Swift脚本获取CPU使用率固定值的问题
问题原因
CPU使用率不是直接读取的数值,得靠两次采样的对比计算得出。带Timer的版本每3秒采样一次,用当前采样数据减去上一次的,就能算出这段时间的CPU使用率;但你改成单次调用后只做了一次采样,没有历史数据做对比,自然只能返回固定的初始值(通常是0或者无意义的数值)。
解决方案
在脚本里执行两次CPU状态采样,中间间隔极短的时间(比如100毫秒),通过两次采样的差值计算真实的CPU使用率。以下是可直接运行的完整Swift脚本:
import Foundation // 存储CPU状态的结构体 struct CPUUsageInfo { let user: UInt64 let system: UInt64 let idle: UInt64 // 计算总CPU耗时 var total: UInt64 { return user + system + idle } } // 获取当前CPU状态采样 func getCPUUsageInfo() -> CPUUsageInfo? { var cpuInfo: processor_info_array_t? var cpuCount = mach_msg_type_number_t(0) let result = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &cpuCount, &cpuInfo) guard result == KERN_SUCCESS, let info = cpuInfo else { return nil } defer { vm_deallocate(mach_task_self(), vm_address_t(UnsafePointer(info)), vm_size_t(cpuCount * MemoryLayout<processor_cpu_load_info_data_t>.stride)) } let loadInfo = UnsafeBufferPointer(start: info, count: Int(cpuCount))[0] return CPUUsageInfo( user: UInt64(loadInfo.cpu_ticks[CPU_STATE_USER]), system: UInt64(loadInfo.cpu_ticks[CPU_STATE_SYSTEM]), idle: UInt64(loadInfo.cpu_ticks[CPU_STATE_IDLE]) ) } // 通过两次采样计算CPU使用率 func calculateCPUUsage(before: CPUUsageInfo, after: CPUUsageInfo) -> Double { let totalDiff = after.total - before.total guard totalDiff > 0 else { return 0.0 } let usedDiff = (after.user - before.user) + (after.system - before.system) return Double(usedDiff) / Double(totalDiff) * 100 } // 主逻辑:两次采样并输出结果 if let firstSample = getCPUUsageInfo() { // 等待100ms,让系统产生可检测的CPU时间变化 usleep(100000) if let secondSample = getCPUUsageInfo() { let usage = calculateCPUUsage(before: firstSample, after: secondSample) print(String(format: "%.1f", usage)) } else { print("获取第二次CPU采样失败") } } else { print("获取第一次CPU采样失败") }
使用说明
- 将代码保存为
cpu-usage.swift文件 - 终端直接运行:
swift cpu-usage.swift,会输出当前CPU使用率百分比 - Node.js中可通过
child_process.exec调用该脚本,直接解析输出的数值即可
关键细节
- 两次采样间隔设为100ms是折中选择:太长会导致负载变化误差大,太短可能出现差值为0的无效计算
- 脚本直接输出格式化后的数值,方便Node.js端直接处理
- 代码包含采样失败的容错处理,避免运行崩溃
内容的提问来源于stack exchange,提问作者zia-khan
相关产品推荐
相关产品推荐

