You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按需获取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采样失败")
}

使用说明

  1. 将代码保存为cpu-usage.swift文件
  2. 终端直接运行:swift cpu-usage.swift,会输出当前CPU使用率百分比
  3. Node.js中可通过child_process.exec调用该脚本,直接解析输出的数值即可

关键细节

  • 两次采样间隔设为100ms是折中选择:太长会导致负载变化误差大,太短可能出现差值为0的无效计算
  • 脚本直接输出格式化后的数值,方便Node.js端直接处理
  • 代码包含采样失败的容错处理,避免运行崩溃

内容的提问来源于stack exchange,提问作者zia-khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:01:14