久しぶりにC言語に触って、ベンチマークなど。
C言語の時間関係の関数をまとめてみた。
特に、clock関数はWindowsとUNIX(Linux)では
求められる時間の意味が異なるのは注意が必要。
ほとんどこのことに言及しているページがないのが
もっと問題だと思う。
----------
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>
※コメント投稿者のブログIDはブログ作成者のみに通知されます