ラップタイム測定プログラム



[ 簡単な説明 ]

lap   command  [parameter1]  [parameter2]  [...]

として実行すると、command 終了時に実行時間を表示します。
(チャイルドプロセスとして、command を実行しています。)

clock( ) 関数の1単位未満を測定するプログラム上の工夫をしています。
( clock( )1単位のカウンタ数を base に設定し、command 実行完了時に clock( )の端数分をカウントして
 換算しています。)

注記:ソース中で使用している CLOCKS_PER_SEC は、<time.h> 中で定義されているマクロ定数です。
   これは、clock( ) 関数が1秒間毎にカウントアップする数値を示しています。
   コンパイラによっては、未定義の系があるかもしれませんが、その場合は各自で clock( ) 関数の
   1秒間のカウントアップ値を調べて、置き換えて下さい。
   ちなみに、Turbo C++ Ver.4.0 では、CLOCKS_PER_SEC = 1000 です。
   このほかに、CLOCKS_PER_SEC = 1 のシステムもありました。


プログラム・ソース("lap.c")           top (トップに戻る)
/*		lap.c		*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(int argc, char *argv[])
{
	int i;
	char com[257];
	clock_t start_time, end_time;
	unsigned long int rests = 0, base = 0;

	if(argc < 2)
	{
		fprintf(stderr, "Usage : lap  command [arg..]\n");
		return EXIT_FAILURE;
	}

	com[0] = 0;

	for(i = 1; i < argc; i++)		/* command を 文字列 com に取込み */
	{
		strcat(com, argv[i]);
		strcat(com, " ");
	}

	start_time = clock();
	while(start_time == clock())	/* 1秒の区切りをつける */
		;
	start_time += CLOCKS_PER_SEC;

	while(start_time == clock())	/* 1秒間 base をカウントアップ */
		base++;

	system(com);					/* command をチャイルドプロセスで実行 */
									/* コマンド開始時刻は
										start_time + CLOCKS_PER_SEC である */

	end_time = clock();				/* 終了時刻を end_time に記録 */
	while(end_time == clock())		/* 1秒未満の端数を rests にカウント */
		rests++;

/*
	コマンド開始時刻 : start_time + CLOCKS_PER_SEC
	コマンド終了時刻 : end_time + CLOCKS_PER_SEC − rests / base 
*/
	fprintf(stderr, "\ncommand : %s\n", com);
	fprintf(stderr, "time : %10.3f [sec]\n",
		(end_time - start_time) / CLOCKS_PER_SEC - rests / (double)base);

	return EXIT_SUCCESS;
}