MST

星途 面试题库

面试题:Objective-C中如何实现基本的App性能监控指标获取

在Objective-C编写的App中,简述如何获取CPU使用率、内存占用这两个基本性能监控指标的方法及相关原理。
38.8万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

获取CPU使用率

  1. 方法: 在Objective-C中,可以使用mach_msg等函数结合task_info来获取CPU使用率。示例代码如下:
#import <mach/mach.h>
#import <mach/mach_time.h>

float getCPULoad() {
    kern_return_t kr;
    task_info_data_t tinfo;
    mach_msg_type_number_t task_info_count;

    task_info_count = TASK_INFO_MAX;
    kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count);
    if (kr != KERN_SUCCESS) {
        return -1;
    }

    task_basic_info_t basic_info;
    basic_info = (task_basic_info_t)tinfo;
    uint64_t user_time = basic_info->user_time.seconds * 1000000000ULL + basic_info->user_time.microseconds * 1000ULL;
    uint64_t system_time = basic_info->system_time.seconds * 1000000000ULL + basic_info->system_time.microseconds * 1000ULL;
    uint64_t total_time = user_time + system_time;

    static uint64_t s_previous_total_time = 0;
    static uint64_t s_previous_system_time = 0;
    static uint64_t s_previous_user_time = 0;

    if (s_previous_total_time == 0) {
        s_previous_total_time = total_time;
        s_previous_system_time = system_time;
        s_previous_user_time = user_time;
        return 0;
    }

    uint64_t elapsed_total_time = total_time - s_previous_total_time;
    uint64_t elapsed_system_time = system_time - s_previous_system_time;
    uint64_t elapsed_user_time = user_time - s_previous_user_time;

    s_previous_total_time = total_time;
    s_previous_system_time = system_time;
    s_previous_user_time = user_time;

    float cpu_usage = (float)(elapsed_system_time + elapsed_user_time) / (float)elapsed_total_time * 100.0f;
    return cpu_usage;
}
  1. 原理: 通过task_info函数获取当前任务(即App进程)的基本信息,其中包含用户态时间(user_time)和内核态时间(system_time)。通过对比前后两次获取的时间差值,计算出在这段时间内CPU用于该任务的时间占比,从而得到CPU使用率。

获取内存占用

  1. 方法: 可以使用task_info函数获取内存相关信息。示例代码如下:
#import <mach/mach.h>
#import <mach/mach_time.h>

size_t getMemoryUsage() {
    task_basic_info_data_t taskInfo;
    mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;
    kern_return_t kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&taskInfo, &infoCount);
    if (kr != KERN_SUCCESS) {
        return -1;
    }
    return taskInfo.resident_size;
}
  1. 原理: 通过task_info函数获取任务的基本信息,其中resident_size字段表示当前任务在物理内存中占用的字节数,即内存占用量。