開発覚え書き

ソフトウェアシステムの開発に関わるさまざまなことの覚え書き

C言語の時間関係の関数のまとめ

2005-04-21 13:12:10 | Weblog
久しぶりにC言語に触って、ベンチマークなど。
C言語の時間関係の関数をまとめてみた。
特に、clock関数はWindowsとUNIX(Linux)では
求められる時間の意味が異なるのは注意が必要。
ほとんどこのことに言及しているページがないのが
もっと問題だと思う。
----------


time関数


	#include <time.h>

	time_t start_time, end_time;
	double sec_time;

	time( &start_time );

	/* 処理 */

	time( &end_time );
	sec_time = difftime( end_time, start_time );
	


<p>精度・分解能:
WindowsでもLinuxでも秒単位。time_t は整数型。</p>





clock関数


	#include <time.h>

	clock_t start_clock, end_clock;
	double sec_clock;

	start_clock = clock();

	/* 処理 */

	end_clock = clock();
	sec_clock = (end_clock - start_clock) / (double)CLOCKS_PER_SEC;
	


<p>精度・分解能:
CLOCKS_PER_SEC 分の1秒。clock_t は整数型。
Windows Visual C++ では CLOCKS_PER_SEC = 1000
Fedora Core2 Linux では CLOCKS_PER_SEC = 1000000
ただ、実際の精度・分解能は計測してみないと分からない。</p>

<p style="color: red; font-weight: bolder; font-size: 110%">注意:
Windows で返ってくる値は実時間。それに対し
UNIX (Linux) では、伝統的に、CPU時間が返る。
この仕様の違いにより両者は比較できないので要注意。</p>





gettimeofday


	#include <sys/time.h>
	int gettimeofday( struct timeval *tv, struct timezone *tz );

	struct timeval {
		time_t tv_sec; /* 紀元 (1970年1月1日00:00:00 UTC) からの経過時間の秒数 */
		suseconds_t tv_usec; /* マイクロ秒 */
	};

	struct timezone {
		int tz_minuteswest; /* グリニッジ標準時との差 (西方に分単位) */
		int tz_dsttime; /* 夏時間調整の型 */
	};
	


処理系:
Linux

使用法:
	struct timeval start_timeval, end_timeval;
	double sec_timeofday;

	gettimeofday( &start_timeval, NULL );

	/* 処理 */

	gettimeofday( &end_timeval, NULL );
	sec_timeofday = (end_timeval.tv_sec - start_timeval.tv_sec)
			+ (end_timeval.tv_usec - start_timeval.tv_usec) / 1000000.0;
	


<p>精度・分解能:
マイクロ秒。
ただ、実際の精度・分解能は計測してみないと分からない。</p>





QueryPerformanceCounter
QueryFrequency


	#include <windows.h>
	


処理系:
Windows

使用法:
	LARGE_INTEGER start_pc, end_pc, freq_pc;
	double sec_pc;

	QueryPerformanceFrequency( &freq_pc );
	QueryPerformanceCounter( &start_pc );

	/* 処理 */

	QueryPerformanceCounter( &end_pc );
	sec_pc = (end_pc.QuadPart - start_pc.QuadPart) / (double)freq_pc.QuadPart;
	


<p>精度・分解能:
非常に良い。
実際の精度・分解能は計測してみないと分からない。
Pentium機では内部で RDTSC 命令を使ってクロックを得ていると思われる。</p>





RDTSC


<p>処理系:
Pentium系CPU搭載マシン</p>

<p>内容:
Pentium系CPUで RDTSC 命令を実行すると、経過クロック数が
上位32ビット edx
下位32ビット dax
の形の64ビット整数として求められる。
これを周波数で割れば秒数が計算できる。
ただし、周波数は別の方法で求める必要がある。</p>





コメントを投稿