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;
    }
}

string0とstring1の値をNSlogして、CPU測定値を把握し、タイマーを介してこのメ​​ソッドを呼び出します。

于 2012-03-31T14:09:27.173 に答える
1

Sampler インストゥルメントは、Instruments 内で常に使用されていた場所です。これに到達するには、Instruments を起動し、空のプロファイリング セッションを使用するか、(Mark が示唆するように) OpenGL ES Driver テンプレートのようなものから開始します。これには既に Sampler インストゥルメントが含まれています。サンプラー インストゥルメントをテンプレートに追加するには、[ライブラリ] ツールバー オプションをクリックし、サンプラーをテンプレートにドラッグします。

個人的には、この回答で説明する理由から、Time Profiler を使用することを好みます。

于 2012-03-31T21:23:37.367 に答える
1

サンプラー計測器の代わりにタイム プロファイラー計測器を使用できます。それらは同様の情報を記録します。

iOS 用のサンプラー インストゥルメントを使用する必要がある場合は、OpenGL ES ドライバー テンプレートを選択します。OpenGL ES Driver テンプレートには Sampler インストゥルメントが含まれています。OpenGL ES ドライバー テンプレートを選択したら、計測器リストから OpenGL ES ドライバー計測器を選択し、Delete (Backspace) キーを押してドキュメントから計測器を削除します。

于 2012-03-31T18:40:36.023 に答える