C言語,clock_gettime()関数で処理時間を計測する

スポンサーリンク

鍛錬 855

C言語,clock_gettime()関数で処理時間を計測する

プログラムの処理時間(実行時間)をナノ秒単位で計測する方法の一つとして、clock_gettime()関数を使用する方法があります。

ソースコードの一部分で処理に要した時間を計測することもできます。
 
以下は、clock_gettime()関数についてです。

#include <time.h>

int clock_gettime(clockid_t clk_id, struct timespec *tp);
 

引数

以下は、上記の引数についてです。

引数 意味
clockid_t clk_id クロック識別子
struct timespec *tp 取得した時刻情報が格納される構造体

クロック識別子

上記のクロック識別子 clk_id は複数存在します。

以下は、処理時間を取得する際に使用するクロック識別子についてです。

引数 意味
CLOCK_MONOTONIC ある開始時間からの、単調増加の時間

timespec 構造体

以下は、timespec 構造体についてです。

#include <time.h>

struct timespec {
	time_t tv_sec;	// 秒
	long tv_nsec;	// ナノ秒
};
 
 
スポンサーリンク

プログラム

以下は、プログラムの処理時間を計測するプログラム、test_clock_gettime.c です。

今回は、プログラム中で 10 秒間スリープさせ、前後の時刻を取得して処理時間を計測しています。

// include
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

// prototype
double CalcDiffTimeNano(struct timespec start, struct timespec end);

// main
int main(void)
{
	double diff_time;
	int ret;
	struct timespec start;
	struct timespec end;
	
	// 開始時刻を取得
	ret = clock_gettime(CLOCK_MONOTONIC, &start);
	if (ret == -1) {
		perror("clock_gettime");
		exit(EXIT_FAILURE);
	}
	
	// 10秒間スリープ
	sleep(10);
	
	// 終了時刻を取得
	clock_gettime(CLOCK_MONOTONIC, &end);
	if (ret == -1) {
		perror("clock_gettime");
		exit(EXIT_FAILURE);
	}
	
	// 時刻の差を計算(ナノ秒単位)
	diff_time = CalcDiffTimeNano(start, end);
	printf("%.9lf (time difference)\n", diff_time);
	
	return 0;
}

// ============================================
// @brief  ナノ秒単位で時刻の差を計算する
// @param  start [in],開始時刻(timespec 構造体)
// @param  end   [in],終了時刻(timespec 構造体)
// @return result -> 計算結果(小数点以下:1e-9)
// @note   無し
// ============================================
double CalcDiffTimeNano(struct timespec start, struct timespec end)
{
	double sec_diff;
	double nsec_start, nsec_end, nsec_diff;
	double result;
	
	// 経過時間(整数部)を計算
	sec_diff = (double)difftime(end.tv_sec, start.tv_sec);
	
	// 開始時刻(小数部)をナノ秒単位に変換
	nsec_start = (double)start.tv_nsec;
	nsec_start = nsec_start * 1e-9;
	
	// 終了時刻(小数部)をナノ秒単位に変換
	nsec_end = (double)end.tv_nsec;
	nsec_end = nsec_end * 1e-9;
	
	// 経過時間(小数部)を計算
	if (nsec_start > nsec_end) {
		nsec_diff = (1.0 - nsec_start) + nsec_end;
		sec_diff--;
	}
	else {
		nsec_diff = nsec_end - nsec_start;
	}
	
	// 経過時間を計算
	result = sec_diff + nsec_diff;
	
	return result;
}

実行結果

以下は、プログラム test_clock_gettime.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_clock_gettime.c -o test_clock_gettime
***@ubuntu:~/***/test/c$ ./test_clock_gettime
10.000598672 (time difference)

 
上記に示した通り、プログラムの処理時間を計測することができました。

スポンサーリンク

シェアする

フォローする