現在、次のように呼び出すことで、プログラムの実行実時間を秒単位で取得しています。
time_t startTime = time(NULL);
//section of code
time_t endTime = time(NULL);
double duration = difftime(endTime, startTime);
ミリ秒単位で壁時間を取得することは可能ですか?もしそうなら、どのように?
現在、次のように呼び出すことで、プログラムの実行実時間を秒単位で取得しています。
time_t startTime = time(NULL);
//section of code
time_t endTime = time(NULL);
double duration = difftime(endTime, startTime);
ミリ秒単位で壁時間を取得することは可能ですか?もしそうなら、どのように?
POSIX風のマシンを使用している場合は、gettimeofday()
代わりに使用してください。これにより、妥当な移植性とマイクロ秒の解像度が得られます。
もう少し難解ですが、POSIXでも、clock_gettime()
ナノ秒の解像度を提供する関数です。
ftime()
多くのシステムでは、実際に秒とミリ秒で時間を返す関数があります。ただし、Single Unix Specificationには含まれていません(POSIXとほぼ同じです)。ヘッダーが必要です<sys/timeb.h>
:
struct timeb mt;
if (ftime(&mt) == 0)
{
mt.time ... seconds
mt.millitime ... milliseconds
}
これは少なくともバージョン7(または第7版)のUnixにまでさかのぼるので、非常に広く利用可能になっています。
また、1秒未満のタイマーコードにメモがtimes()
ありclock()
、他の構造とヘッダーを再び使用しています。clock()
また、毎秒1000クロックティック(ミリ秒のタイミング)で使用するWindowsに関するメモと、 GetTickCount()
Windows95では必要であるがNTではない古いインターフェイスについてのメモもあります。
プログラム自体の外部でこれを実行できる場合、Linuxでは、time
コマンド(time ./my_program
)を使用できます。
私は最近、クロスプラットフォームのミリ秒単位で時間を取得する方法を説明するブログ投稿を書きました。
これはtime(NULL)のように機能しますが、WindowsとLinuxの両方でUNIXエポックからの秒数ではなくミリ秒数を返します。
#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif
/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
* windows and linux. */
int64 GetTimeMs64()
{
#ifdef WIN32
/* Windows */
FILETIME ft;
LARGE_INTEGER li;
uint64 ret;
/* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
* to a LARGE_INTEGER structure. */
GetSystemTimeAsFileTime(&ft);
li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;
ret = li.QuadPart;
ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */
return ret;
#else
/* Linux */
struct timeval tv;
uint64 ret;
gettimeofday(&tv, NULL);
ret = tv.tv_usec;
/* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
ret /= 1000;
/* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
ret += (tv.tv_sec * 1000);
return ret;
#endif
}
必要に応じて、ミリエスコンドの代わりにマイクロ秒を返すように変更できます。
オープンソースのGLibライブラリには、マイクロ秒の精度を提供すると主張するGTimerシステムがあります。このライブラリは、Mac OS X、Windows、およびLinuxで利用できます。私は現在、Linuxでパフォーマンスのタイミングをとるためにそれを使用していますが、完全に機能しているようです。
gprof
GNUツールキットの一部である、はオプションです。ほとんどのPOSIXシステムにはインストールされており、CygwinforWindowsで使用できます。自分で時間を追跡することはgettimeofday()
問題なく機能しますが、デバッグにprintステートメントを使用するのと同等のパフォーマンスです。迅速で汚い解決策が必要な場合は良いのですが、適切なツールを使用するほどエレガントではありません。
を使用するgprof
には、次のようにコンパイルするときに-pgオプションを指定する必要がありますgcc
。
gcc -o prg source.c -pg
gprof
次に、生成されたプログラムを次のように実行できます。
gprof prg > gprof.out
デフォルトでは、gprofは、プログラムの全体的な実行時間、各関数で費やされた時間、各関数が呼び出された回数、各関数呼び出しで費やされた平均時間、および同様の情報を生成します。
で設定できるオプションは多数ありますgprof
。興味がある場合は、manページまたはGoogleを通じて詳細情報を入手できます。
Windowsでは、QueryPerformanceCounterおよび関連するQueryPerformanceFrequencyを使用します。カレンダーの時間に変換できる時間は提供されないため、必要な場合は、CRT APIを使用して時間を要求し、すぐにQueryPerformanceCounterを使用してください。次に、単純な加算/減算を実行してカレンダー時間を計算できますが、APIを連続して実行するのにかかる時間のためにエラーが発生します。ねえ、それはPCです、あなたは何を期待しましたか?