2011-07-22 13 views
1

アプリケーション内の特定のスレッド、プロセス、または一部のコードに対してCPU使用率を取得できるかどうかは知りませんか? AUGraphを見ると、平均CPU使用量を返す関数があります。彼らはどのようにそれをするのですか?スレッドのiOSとMac CPUの使用

答えて

3

これはiOSにも当てはまるとは確信していませんが、OS XではMach/BSDサブシステムにアクセスすることで必要な情報を得ることができます。基本的には、特定のプロセスのスレッド一覧を取得し、すべてのスレッドの使用量を合計してプロセスCPU使用量を取得します。スレッドCPU使用量だけが必要な場合は、要約する必要はありません。

1が望むかもしれないほど簡単で単純ではないが、ここでは(このコードは、「マックOS Xの内部」アミット・シンに基づいています):

  pid_t pid = ...; //-- this is the process id you need info for 
      task_t port; 
      task_for_pid(mach_task_self(), pid, &port); 

      task_info_data_t tinfo; 
      mach_msg_type_number_t task_info_count; 

      task_info_count = TASK_INFO_MAX; 
      kr = task_info(port, TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count); 
      if (kr != KERN_SUCCESS) { 
        continue; //-- skip this task 
      } 

      task_basic_info_t  basic_info; 
      thread_array_t   thread_list; 
      mach_msg_type_number_t thread_count; 

      thread_info_data_t  thinfo; 
      mach_msg_type_number_t thread_info_count; 

      thread_basic_info_t basic_info_th; 
      uint32_t stat_thread = 0; // Mach threads 

      basic_info = (task_basic_info_t)tinfo; 

      // get threads in the task 
      kr = task_threads(port, &thread_list, &thread_count); 
      if (kr != KERN_SUCCESS) { 
        <HANDLE ERROR> 
        continue; 
      } 
      if (thread_count > 0) 
        stat_thread += thread_count; 

      long tot_sec = 0; 
      long tot_usec = 0; 
      long tot_cpu = 0; 
      int j; 

      for (j = 0; j < thread_count; j++) { 
        thread_info_count = THREAD_INFO_MAX; 
        kr = thread_info(thread_list[j], THREAD_BASIC_INFO, 
            (thread_info_t)thinfo, &thread_info_count); 
        if (kr != KERN_SUCCESS) { 
          <HANDLE ERROR> 
          continue; 
        } 
        basic_info_th = (thread_basic_info_t)thinfo; 


        if (!(basic_info_th->flags & TH_FLAGS_IDLE)) { 
          tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds; 
          tot_usec = tot_usec + basic_info_th->system_time.microseconds + basic_info_th->system_time.microseconds; 
          tot_cpu = tot_cpu + basic_info_th->cpu_usage; 
        } 

      } // for each thread 

私にはわからない場合がありますおそらくそれを行うより良い方法ですが、これは私のために働いています。

+0

想像以上に少し複雑ですが、プロセッサ使用量だけでなくスレッド使用量を得る唯一の方法のように思えます。ありがとう:) – thealch3m1st

+0

これは非常に冗長ですが、たとえば、1つのスレッドのデータが必要な場合は、次を参照してください。http://stackoverflow.com/questions/13893134/get-current-pthread-cpu-usage-mac- os-x – Aktau

2

EDIT:謝罪 - あなたの質問を間違えた。これは、アプリケーション内の特定のスレッド/プロセスの使用状況を表示するのではなく、AUGraphの機能を実行します。

#include <stdlib.h> 

double loadavg[3]; 
getloadavg(loadavg, 3); 
NSLog(@"Average over last minute: %f", loadavg[0]); 
NSLog(@"Average over last 5 minutes: %f", loadavg[1]); 
NSLog(@"Average over last 10 minutes: %f", loadavg[2]); 

サンプル出力:

だけgetloadavg()使うので

... getloadavg[62486:207] Average over last minute: 0.377441 
... getloadavg[62486:207] Average over last 5 minutes: 0.450195 
... getloadavg[62486:207] Average over last 10 minutes: 0.415527 

を、これらの報告された値を百分率です。そのように表示するには:アップルのmanページhereから

... getloadavg[62531:207] Average over last minute: 23.93% 
... getloadavg[62531:207] Average over last 5 minutes: 33.01% 
... getloadavg[62531:207] Average over last 10 minutes: 36.72% 

より:このから

#include <stdlib.h> 

double loadavg[3]; 
getloadavg(loadavg, 3); 
NSLog(@"Average over last minute: %02.2f%%", loadavg[0] * 100); 
NSLog(@"Average over last 5 minutes: %02.2f%%", loadavg[1] * 100); 
NSLog(@"Average over last 10 minutes: %02.2f%%", loadavg[2] * 100); 

サンプル出力を。

+0

これはprevの回答よりも簡単ですが、スレッドだけでなくプロセス全体の負荷を返します。編集:申し訳ありません。私はちょうどあなたの編集に気づいた。 – thealch3m1st

+0

loadavg [2]は平均15分です – iwill

+0

"getloadavg()関数は、システム内のプロセス数を返す 実行キューの平均時間はさまざまです。どのようにCPU使用量を与えるのですか? –

関連する問題