web-dev-qa-db-ja.com

Cプログラミング言語のタイムスタンプ

T1とt2を2回スタンプし、Cでミリ秒単位の差を取得するにはどうすればよいですか?

23
Chris_45

これにより、秒単位の時間+マイクロ秒が得られます

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
tv.tv_sec // seconds
tv.tv_usec // microseconds
30
Arkaitz Jimenez

標準C99:

#include <time.h>

time_t t0 = time(0);
// ...
time_t t1 = time(0);
double datetime_diff_ms = difftime(t1, t0) * 1000.;

clock_t c0 = clock();
// ...
clock_t c1 = clock();
double runtime_diff_ms = (c1 - c0) * 1000. / CLOCKS_PER_SEC;

型の精度は実装定義です。つまり、日時の差は完全な秒のみを返す場合があります。

9
Christoph
/*
 Returns the current time.
*/

char *time_stamp(){

char *timestamp = (char *)malloc(sizeof(char) * 16);
time_t ltime;
ltime=time(NULL);
struct tm *tm;
tm=localtime(&ltime);

sprintf(timestamp,"%04d%02d%02d%02d%02d%02d", tm->tm_year+1900, tm->tm_mon, 
    tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
return timestamp;
}


int main(){

printf(" Timestamp: %s\n",time_stamp());
return 0;

}

出力:タイムスタンプ:20110912130940 // 2011 Sep 12 13:09:40

経過時間を検索する場合、この方法は、開始と終了の間にコンピューターを再起動しない限り機能します。

Windowsでは、GetTickCount()を使用します。方法は次のとおりです。

DWORD dwStart = GetTickCount();
...
... process you want to measure elapsed time for
...
DWORD dwElapsed = GetTickCount() - dwStart;

dwElapsedは経過ミリ秒数です。

Linuxでは、clock()およびCLOCKS_PER_SECを使用してほぼ同じことを行います。

再起動後またはPC間で有効なタイムスタンプが必要な場合(実際には非常に良好な同期が必要)、他のメソッド(gettimeofday())を使用します。

また、少なくともWindowsでは、標準の時間解像度よりもはるかに優れた結果を得ることができます。通常、タイトループでGetTickCount()を呼び出した場合、変更するたびに10〜50ずつジャンプします。これは、Windowsスレッドスケジューラで使用されるタイムクォンタムのためです。これは多かれ少なかれ、各スレッドが他の何かに切り替わる前に各スレッドを実行する時間になります。あなたがする場合:

timeBeginPeriod(1);

プログラムまたはプロセスの開始時、および:

timeEndPeriod(1);

最後に、クォンタムが1ミリ秒に変わり、GetTickCount()呼び出しでより良い時間分解能が得られます。ただし、これにより、コンピューター全体でのプロセスの実行方法に微妙な変更が加えられるため、そのことに留意してください。ただし、Windows Media Playerや他の多くのものは、とにかくこれを定期的に行うので、あまり心配する必要はありません。

Linuxで同じことを行う方法はおそらくあるはずです(おそらく、より優れた制御、またはサブミリ秒の量子で)。しかし、Linuxでそれを行う必要はまだありません。

6
darron

@Arkaitz Jimenezのコードを使用して、2つのtimevalを取得します。

#include <sys/time.h>
//...
struct timeval tv1, tv2, diff;

// get the first time:
gettimeofday(&tv1, NULL);

// do whatever it is you want to time
// ...

// get the second time:
gettimeofday(&tv2, NULL);

// get the difference:

int result = timeval_subtract(&diff, &tv1, &tv2);

// the difference is storid in diff now.

Timeval_subtractのサンプルコードは このWebサイト にあります。

 /* Subtract the `struct timeval' values X and Y,
    storing the result in RESULT.
    Return 1 if the difference is negative, otherwise 0.  */

 int
 timeval_subtract (result, x, y)
      struct timeval *result, *x, *y;
 {
   /* Perform the carry for the later subtraction by updating y. */
   if (x->tv_usec < y->tv_usec) {
     int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
     y->tv_usec -= 1000000 * nsec;
     y->tv_sec += nsec;
   }
   if (x->tv_usec - y->tv_usec > 1000000) {
     int nsec = (x->tv_usec - y->tv_usec) / 1000000;
     y->tv_usec += 1000000 * nsec;
     y->tv_sec -= nsec;
   }

   /* Compute the time remaining to wait.
      tv_usec is certainly positive. */
   result->tv_sec = x->tv_sec - y->tv_sec;
   result->tv_usec = x->tv_usec - y->tv_usec;

   /* Return 1 if result is negative. */
   return x->tv_sec < y->tv_sec;
 }
3
Bill

このソリューションはどうですか?私の検索ではこのようなものは見つかりませんでした。私は分裂を避け、解決策をより簡単にしようとしています。

   struct timeval cur_time1, cur_time2, tdiff;

   gettimeofday(&cur_time1,NULL);
   sleep(1);
   gettimeofday(&cur_time2,NULL);

   tdiff.tv_sec = cur_time2.tv_sec - cur_time1.tv_sec;
   tdiff.tv_usec = cur_time2.tv_usec + (1000000 - cur_time1.tv_usec);

   while(tdiff.tv_usec > 1000000)
   {
      tdiff.tv_sec++;
      tdiff.tv_usec -= 1000000;
      printf("updated tdiff tv_sec:%ld tv_usec:%ld\n",tdiff.tv_sec, tdiff.tv_usec);
   }

   printf("end tdiff tv_sec:%ld tv_usec:%ld\n",tdiff.tv_sec, tdiff.tv_usec);
2
n00pster

また、clock()とusleep()の間の相互作用を認識します。 usleep()はプログラムを一時停止し、clock()はプログラムの実行時間のみを測定します。

前述のようにgettimeofday()を使用した方がよい場合 here

1
Venkat R

gettimeofday() 以上を使用してください clock_gettime()

0

Uは、c timeライブラリのルーチンを試すことができます( time.h )。さらに、同じライブラリの clock() を見てください。 progが開始されてから、時計の刻みを与えます。しかし、集中したい操作の前にその値を保存し、その操作の後にクリオティックを再度キャプチャし、その時差を見つけて時間差を取得することができます。

0
deostroll