5

rusageを使って様々な関数呼び出しのリソース使用時間(ユーザーとシステム)を測定しようとしています。私が得ている結果は、0s 70000us、10000us などのように数十ミリ秒のオーダーであることがわかりました。getrusage の精度/粒度を設定する方法があれば教えてください。

私のプログラムは簡単です:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>

int main(){
  struct rusage usage;
  struct timeval start, end;
  int i, j, k = 0;

  getrusage(RUSAGE_SELF, &usage);
  start = usage.ru_utime;
  printf("buffer check\n");
  char *str = "---";
  int arr[100],ctr;

  for(ctr = 0;ctr<100;ctr++){

    arr[ctr] = ctr + 1000;

  }

  for (i = 0; i < 10000; i++) {
     for (j = 0; j < 10000; j++) {
      k += 20;
  }
 }

 getrusage(RUSAGE_SELF, &usage);
 end = usage.ru_utime;

 printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec);
 printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec);

 return 1;
}

結果 開始: 0.0s 終了: 0.2000000s

別の for ループを追加すると、次のような結果が得られました: 開始時刻: 0.0 秒 終了時刻: 0.7000000 秒 Linux ソースなどで 3 つのパラメーター getrusage に出くわしましたが、最初のパラメーターとしてタスク ポインターが必要だったため、使用方法がわかりません。リンクの1つは、Linuxバージョンと関係があることを示唆しています。とにかく、精度/粒度を設定する方法があれば教えてください。そうでない場合は、getrusage の代わりになるものがあれば教えてください。gettimeofDay はリソースの使用状況の詳細を提供していないようです。そのため、何らかの方法で精度を設定できない場合は、getrusage の実​​際の実装を探します。

4

3 に答える 3

0
My new program:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
//int clock_gettime(clockid_t clk_id, struct timespect *tp);

#define BILLION  1000000000L;

void testClockGetTime(clockid_t clk_id , struct timespec *start , struct timespec  *stop){

   long temp = 0,i;
   unsigned long accumsec,accumns;
   if( clock_gettime( clk_id, start) == -1 ) {
      perror( "clock gettime" );
      exit( EXIT_FAILURE );
   }
   for ( i = 0; i< 24222000; i++)
       temp+=temp;

   if( clock_gettime( clk_id, stop) == -1 ) {
      perror( "clock gettime" );
      exit( EXIT_FAILURE );
    }
    accumsec = stop->tv_sec - start->tv_sec;
    accumns =  stop->tv_nsec - start->tv_nsec;
    if(stop->tv_nsec<start->tv_nsec){
       accumsec = accumsec - 1;
       accumns = start->tv_nsec - stop->tv_nsec;
    }

    printf( " sec %ld\n", accumsec );
    printf(" ns %ld\n", accumns );

  }

int main( int argc, char **argv )
 {
   struct timespec start, stop;
   struct timeval tds,tdse;
   memset(&tds,0,sizeof(struct timeval));
   memset(&tdse,0,sizeof(struct timeval));
   unsigned long accumsec,accumns;
   long timesec, timeusec;
   printf("checking on various timers gives by clockGetTime \n");
   printf("cpu time\n");
   memset(&stop,0,sizeof(struct timespec));
   memset(&start,0,sizeof(struct timespec));
   testClockGetTime(CLOCK_PROCESS_CPUTIME_ID , &start,&stop);
   memset(&start,0,sizeof(struct timespec));
   memset(&stop,0,sizeof(struct timespec));
   printf("real time\n");    
   testClockGetTime(CLOCK_REALTIME,&start,&stop);
   memset(&start,0,sizeof(struct timespec));
   memset(&stop,0,sizeof(struct timespec));
   printf("monotonic\n");    
   testClockGetTime(CLOCK_MONOTONIC,&start,&stop);
   memset(&start,0,sizeof(struct timespec));
   memset(&stop,0,sizeof(struct timespec));
   printf("thread\n");
   testClockGetTime(CLOCK_THREAD_CPUTIME_ID,&start,&stop);
   memset(&start,0,sizeof(struct timespec));
   memset(&stop,0,sizeof(struct timespec));
   gettimeofday(&tds, NULL);
   long temp,i;
   for ( i = 0; i< 24222000; i++)
      temp+=temp;
   gettimeofday(&tdse, NULL);
   if( clock_gettime( CLOCK_PROCESS_CPUTIME_ID, &stop) == -1 ) {
      perror( "clock gettime" );
      exit( EXIT_FAILURE );
    }

    //   accumsec = stop.tv_sec - start.tv_sec; 
    //   accumns =  stop.tv_nsec - start.tv_nsec; 
    //   if(stop.tv_nsec<start.tv_nsec){
    //     accumsec = accumsec - 1;
    //     accumns = start.tv_nsec - stop.tv_nsec;
    //   }

    //   printf( "proc sec %ld\n", accumsec );
    //   printf( "proc ns %ld\n", accumns );
    //    printf("before day =%ld,%ld\n",tds.tv_sec,tds.tv_usec);
    //    printf("after day=%ld,%ld\n",tdse.tv_sec, tdse.tv_usec);
    timesec =  tdse.tv_sec - tds.tv_sec;
    timeusec=  tdse.tv_usec- tds.tv_usec;
  if(tdse.tv_usec < tds.tv_usec){
    timesec = timesec - 1;
    timeusec= tds.tv_usec - tdse.tv_usec;
   }
   printf("daytime sec =%ld\n",timesec);
   printf("daytime usec=%ld\n",timeusec);
   return( EXIT_SUCCESS );
 }

結果:

最初の実行 > gcc getclk.c -o dfkj -lrt

getclk.c: 関数 'main' 内:

getclk.c:40: 警告: 組み込み関数 'memset' の暗黙的な宣言に互換性がありません

./dfkj

さまざまなタイマーのチェックは、clockGetTime によって提供されます

CPU時間

秒 0

ns 54502537

リアルタイム

秒 0

ns 53748970

単調

秒 0

ns 55456758

スレッド

秒 0

ns 58649229

昼間秒=0

昼間usec=56991

2 回目の実行>./dfkj

さまざまなタイマーのチェックは、clockGetTime によって提供されます

CPU時間

秒 0

ns 54220021

リアルタイム

秒 0

ns 52774966

単調

秒 0

ns 53636163

スレッド

秒 0

ns 53357492

昼間秒=0

昼間usec=56176

于 2013-10-01T04:13:03.947 に答える