【问题标题】:Get CPU usage at runtime | iOS运行时获取 CPU 使用率 | iOS
【发布时间】:2012-08-04 06:20:24
【问题描述】:

有什么方法可以获取 iPhone 的整体 CPU 使用率。我见过一些应用程序,例如用于 iPhone 的 Battery Doctor 和 System Activity Monitor,它们显示整体 CPU 使用率。

我找到了一个解决方案 (link to the answer),但它只提供了我的应用程序的 CPU 使用率,而不是所有整体应用程序的 CPU 使用率。

【问题讨论】:

  • 查看此应用bjango.com/iphone/istat
  • 我还列出了一些这样做的应用程序。我想知道如何在我的应用程序中执行此操作。

标签: iphone ios xcode cpu-usage


【解决方案1】:

请试试这个,这对你来说可能是一个好的开始。 仅在真机上测试过。

processor_info_array_t _cpuInfo, _prevCPUInfo = nil;
mach_msg_type_number_t _numCPUInfo, _numPrevCPUInfo = 0;
unsigned _numCPUs;
NSLock *_cpuUsageLock;

int _mib[2U] = { CTL_HW, HW_NCPU };
size_t _sizeOfNumCPUs = sizeof(_numCPUs);
int _status = sysctl(_mib, 2U, &_numCPUs, &_sizeOfNumCPUs, NULL, 0U);
if(_status)
    _numCPUs = 1;

_cpuUsageLock = [[NSLock alloc] init];

natural_t _numCPUsU = 0U;
kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &_numCPUsU, &_cpuInfo, &_numCPUInfo);
if(err == KERN_SUCCESS) {
    [_cpuUsageLock lock];

    for(unsigned i = 0U; i < _numCPUs; ++i) {
        Float32 _inUse, _total;
        if(_prevCPUInfo) {
            _inUse = (
                     (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER]   - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER])
                     + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM])
                     + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]   - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE])
                     );
            _total = _inUse + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]);
        } else {
            _inUse = _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE];
            _total = _inUse + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE];
        }

        NSLog(@"Core : %u, Usage: %.2f%%", i, _inUse / _total * 100.f);
    }

    [_cpuUsageLock unlock];

    if(_prevCPUInfo) {
        size_t prevCpuInfoSize = sizeof(integer_t) * _numPrevCPUInfo;
        vm_deallocate(mach_task_self(), (vm_address_t)_prevCPUInfo, prevCpuInfoSize);
    }

    _prevCPUInfo = _cpuInfo;
    _numPrevCPUInfo = _numCPUInfo;

    _cpuInfo = nil;
    _numCPUInfo = 0U;
} else {
    NSLog(@"Error!");
}

您还需要以下标题:

#import <sys/sysctl.h>
#import <sys/types.h>
#import <sys/param.h>
#import <sys/mount.h>
#import <mach/mach.h>
#import <mach/processor_info.h>
#import <mach/mach_host.h>

【讨论】:

  • 我按照您所说的进行了尝试,并获得了 CPU 使用率的一些价值。如果我去启动其他一些在后台运行或开始在后台播放音乐的应用程序,CPU 使用率应该会上升吗?但我得到了与之前相同的值。
  • 理论上是的,应该会发生。
  • @ManishAhuja 上面代码的问题在于他在本地声明了 _prevCPUInfo 变量,因此无法正确评估“if(_prevCPUInfo)”条件。
  • 这个方法根本行不通。在 CPU 满载时,核心 1 始终返回 6.89%,核心 0 始终返回 7.38%。
  • @Legoless,可以更具体一点吗?在模拟器上?在设备上?你怎么知道它是满载的?谁告诉你CPU满载了?等等……
猜你喜欢
  • 2017-11-28
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多