0

我想在我的项目中使用“CPU 采样器”进行 CPU 测量,但我找不到它。我正在使用 XCode 4.3

4

4 回答 4

2

首先在你的接口文件中导入所有需要的头文件。

#include <sys/sysctl.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <mach/processor_info.h>
#include <mach/mach_host.h>

processor_info_array_t cpuInfo, prevCpuInfo;
mach_msg_type_number_t numCpuInfo, numPrevCpuInfo;
unsigned numCPUs;
NSLock *CPUUsageLock;

并在您的实现文件中。

- (void)cpuSampler:(NSTimer *)timer
  {
    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) {
               float 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];
               }
               if (i == 0) {
                 NSString *string0 = [NSString stringWithFormat:@"Core: %u Usage: %f%",i,(inUse / total)*100];
               }
              if (i == 1) {
                 NSString *string1 = [NSString stringWithFormat:@"Core: %u Usage: %f%",i,(inUse / total)*100];
              }
          }
      [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 = NULL;
    numCpuInfo = 0U;
    }
}

NSlog string0 和 string1 的值以了解 CPU 测量并通过计时器调用此方法。

于 2012-03-31T14:09:27.173 回答
1

您可以使用 Time Profiler 乐器代替 Sampler 乐器。他们记录了类似的信息。

如果您需要使用适用于 iOS 的 Sampler 仪器,请选择 OpenGL ES Driver 模板。OpenGL ES Driver 模板包括 Sampler 工具。选择 OpenGL ES Driver 模板后,从仪器列表中选择 OpenGL ES Driver 仪器,然后按 Delete (Backspace) 键将仪器从文档中删除。

于 2012-03-31T18:40:36.023 回答
1

采样器乐器一直在乐器中。为此,请启动 Instruments 并使用空白分析会话或从 OpenGL ES Driver 模板(如 Mark 建议的那样)之类的东西开始,其中已经包含 Sampler 仪器。要将 Sampler 乐器添加到您的模板中,请单击 Library 工具栏选项并将 Sampler 拖到您的模板中。

就个人而言,我更喜欢使用 Time Profiler,原因我在这个答案中描述。

于 2012-03-31T21:23:37.367 回答
0

左上角有一个运行按钮,看起来像一个播放按钮。如果您单击将出现一个下拉菜单,请选择配置文件。这将打开“仪器”,您可以在其中选择“时间分析器”。如果应用程序没有在模拟器中自动启动,请单击记录。

我建议选中“隐藏系统库”和“仅显示 Obj-C”复选框,以便查看代码。

*注意,如果你双击一个函数,它会显示它在一些代码上花费的时间的百分比细分,这非常方便。

于 2012-03-31T13:58:20.613 回答