4

C言語で現在の時刻/日付/日/年を取得する最も効率的な方法は何ですか? これを何度も実行する必要があるため、本当に効率的な方法が必要です。私はfreeBSDを使用しています。

前もって感謝します。

4

8 に答える 8

6
/* ctime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time_t rawtime;

  time ( &rawtime );
  printf ( "The current local time is: %s", ctime (&rawtime) );

  return 0;
}

文字列として必要な場合は、ctimeを使用できます。

于 2010-08-04T04:50:35.093 に答える
5

標準 C では、時刻を取得する方法が 1 つしかありません。これは、またはtime()を使用して時刻/日付/年に変換できます。自明なことですが、それが最も効率的な方法に違いありません。localtime()gmtime()

他の方法はオペレーティング システム固有のものであり、使用しているオペレーティング システムを教えてくれませんでした。

于 2010-08-04T04:51:45.267 に答える
3

それは本当にあなたが「多く」が何を意味するかに依存します:-)

time()ISO標準とlocaltime()関数を使用すると、十分に高速になることがわかると思います。たとえば、私の"Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz"場合、最適化されていないコードを使用するとtime()、1.045秒で1,000万回呼び出しtime()/localtime()、0.98秒で組み合わせて50万回呼び出すことができます。それがあなたのニーズに対して十分に速いかどうか、あなただけが決めることができます、しかし私はそれよりもっとうなり声を必要とするユースケースを考え出すのに苦労しています。

このtime()関数は、エポックからの秒数を提供しますが、両方ともそれを現地時間(UTCから)に変換し、より使いやすい形式である構造localtime()に分割します。struct tm

#include <time.h>
time_t t = time (NULL);
struct tm* lt = localtime (&t);
// Use lt->tm_year, lt->tm_mday, and so forth.

日付/時刻をキャッシュし、それに適用するデルタを見つける他の方法を使用しようとするとclock()、ほとんどの場合、次のようになります。

  • 遅くなる; と
  • あなたが外部の時間の変化を拾わないという事実に苦しんでいます。
于 2010-08-04T04:47:38.453 に答える
1

最も単純なのは

#include <time.h>
//...
time_t current_time = time (NULL);
struct tm* local_time = localtime (&current_time); 
printf ("the time is %s\n", asctime (local_time));
于 2010-08-04T04:47:26.653 に答える
1

gettimeofday() 関数を使用して、秒とマイクロ秒で時間を取得できます。これは (Linux カーネル do_gettimeofday() に同様の関数があるため) 非常に高速であり、必要な形式に変換できます (変換には上記の関数を使用します。

これが役立つことを願っています。

于 2010-08-04T09:57:34.037 に答える
0

ほぼ唯一の方法(とにかく、それは標準です)は、またはをtime続けて呼び出すことです。localtimegmtime

于 2010-08-04T04:47:40.263 に答える
0

一般に、時間を取得するためにOSのAPIに直接アクセスするのがおそらく最も効率的ですが、それほど移植性はありません。

C時間関数は問題ありません。

しかし、実際にはプラットフォームによって異なります

于 2010-08-04T04:49:16.380 に答える
0

1 秒の解像度で十分であると仮定すると、FreeBSD (または任意の POSIX システム) で最も効率的な方法はおそらく

  • 1秒間隔タイマーをインストールしますsetitimer (ITIMER_REAL, ...)
  • をトリガーするとSIGALRM、現在の時刻を保持する静的変数を更新します
  • 時間が必要なときはいつでも静的変数の値を使用してください

システムの過負荷のためにシグナルが失われたとしても、次回プロセスがスケジュールされたときに自動的に修正されます。

于 2012-07-01T07:14:48.223 に答える