【C言語】時間を計測するtime関数とclock関数の違い

C言語で時間を計測する方法には、time関数clock関数の2つがあります。

この記事では、これらの関数の基本的な使い方や違いについて、初心者の方にもわかりやすく解説します。

具体的には、time関数を使って現在の時刻を取得する方法や、clock関数を使ってプログラムの実行時間を計測する方法を学びます。

また、それぞれの関数がどのようなシーンで使われるのかも紹介します。

この記事を読むことで、C言語での時間計測の基礎をしっかりと理解できるようになります。

目次から探す

time関数とは

C言語には、時間を扱うための関数がいくつか用意されています。

その中でも、time関数はシステム全体の時間を取得するために使用されます。

ここでは、time関数の基本的な使い方や用途について詳しく解説します。

time関数の基本

time関数の定義

time関数は、標準ライブラリ <time.h> に定義されています。

この関数は、現在のカレンダー時刻を取得し、time_t 型の値として返します。

関数のプロトタイプは以下の通りです。

time_t time(time_t *t);

引数として time_t 型のポインタを受け取りますが、NULL を渡すことも可能です。

引数が NULL でない場合、取得した時刻がそのポインタに格納されます。

time_t型について

time_t 型は、カレンダー時刻を表すためのデータ型です。

具体的には、1970年1月1日0時0分0秒(UTC)からの経過秒数を表します。

このため、time_t 型の値は通常、整数型として扱われます。

time関数の使い方

サンプルコード

以下に、time関数を使用して現在の時刻を取得するサンプルコードを示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time;
    // 現在の時刻を取得
    time(¤t_time);
    // 取得した時刻を文字列に変換して表示
    printf("現在の時刻: %s", ctime(¤t_time));
    return 0;
}

実行結果の解説

上記のコードを実行すると、現在の時刻が表示されます。

例えば、以下のような出力が得られます。

現在の時刻: Wed Oct 11 14:32:45 2023

この出力は、ctime 関数を使用して time_t 型の値を可読な文字列に変換した結果です。

ctime 関数は、time_t 型の値を標準的な形式の文字列に変換します。

time関数の用途

現在時刻の取得

time関数の最も一般的な用途は、現在の時刻を取得することです。

これにより、システムの現在時刻を簡単に取得し、ログのタイムスタンプや時間に依存する処理を行うことができます。

経過時間の計測

time関数は、経過時間の計測にも使用できます。

例えば、プログラムの開始時刻と終了時刻を取得し、その差を計算することで、プログラムの実行時間を測定することができます。

以下にそのサンプルコードを示します。

#include <stdio.h>
#include <time.h>
int main() {
    time_t start_time, end_time;
    double elapsed_time;
    // プログラムの開始時刻を取得
    time(&start_time);
    // ここに計測したい処理を記述
    for (int i = 0; i < 1000000; i++);
    // プログラムの終了時刻を取得
    time(&end_time);
    // 経過時間を計算
    elapsed_time = difftime(end_time, start_time);
    printf("経過時間: %.2f 秒\n", elapsed_time);
    return 0;
}

このコードでは、difftime 関数を使用して開始時刻と終了時刻の差を計算し、経過時間を秒単位で表示しています。

difftime 関数は、2つの time_t 型の値の差を秒単位で返します。

以上が、time関数の基本的な使い方とその用途です。

time関数を活用することで、現在時刻の取得や経過時間の計測が簡単に行えます。

clock関数とは

clock関数の基本

clock関数の定義

clock関数は、C言語の標準ライブラリに含まれる関数で、プログラムの実行開始から現在までのプロセスのCPU時間を計測するために使用されます。

time関数がシステム全体の時間を計測するのに対し、clock関数は特定のプロセスのCPU時間を計測するため、より精度の高い時間計測が可能です。

clock_t型について

clock関数は、clock_t型の値を返します。

clock_t型は、CPU時間を表すためのデータ型で、通常は整数型として定義されています。

clock関数が返す値は、プロセスの実行開始からのCPU時間をクロックティック(clock ticks)単位で表しています。

clock関数の使い方

サンプルコード

以下に、clock関数を使用してプログラムの実行時間を計測するサンプルコードを示します。

#include <stdio.h>
#include <time.h>
int main() {
    clock_t start, end;
    double cpu_time_used;
    // 計測開始
    start = clock();
    // 計測対象の処理
    for (int i = 0; i < 1000000; i++) {
        // 何らかの処理
    }
    // 計測終了
    end = clock();
    // CPU時間の計算
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("CPU時間: %f 秒\n", cpu_time_used);
    return 0;
}

実行結果の解説

上記のサンプルコードでは、clock関数を使用してプログラムの実行開始時と終了時のCPU時間を計測しています。

start変数に開始時のCPU時間を、end変数に終了時のCPU時間を格納し、これらの差を計算することで、プログラムの実行にかかったCPU時間を求めています。

CLOCKS_PER_SECは、1秒あたりのクロックティック数を表す定数で、これを用いて秒単位に変換しています。

clock関数の用途

プロセスのCPU時間の計測

clock関数は、特定のプロセスのCPU時間を計測するために使用されます。

これにより、プログラムの特定の部分がどれだけのCPU時間を消費しているかを正確に把握することができます。

例えば、アルゴリズムの性能評価や、最適化の効果を確認する際に役立ちます。

精度の高い時間計測

clock関数は、プロセスのCPU時間をクロックティック単位で計測するため、非常に高い精度で時間を計測することができます。

これにより、微小な時間差を正確に測定することが可能となり、詳細な性能分析やデバッグにおいて重要な役割を果たします。

time関数とclock関数の違い

C言語には時間を計測するための関数として time 関数clock 関数がありますが、これらは異なる目的で使用されます。

以下では、それぞれの違いについて詳しく解説します。

計測対象の違い

time関数: システム全体の時間

time 関数は、システム全体の時間を計測するために使用されます。

この関数は、1970年1月1日からの経過秒数を返します。

システムの現在時刻を取得するために使用されることが多く、例えばログのタイムスタンプを記録する際などに利用されます。

#include <stdio.h>
#include <time.h>
int main() {
    time_t current_time;
    current_time = time(NULL);
    printf("現在の時刻: %ld\n", current_time);
    return 0;
}

clock関数: プロセスのCPU時間

一方、clock 関数は、プログラムが実行されているプロセスのCPU時間を計測します。

これは、プログラムが開始されてから現在までに消費したCPU時間を返します。

プロセスのパフォーマンスを測定するために使用されることが多く、特定のコードブロックの実行時間を計測する際に便利です。

#include <stdio.h>
#include <time.h>
int main() {
    clock_t start, end;
    double cpu_time_used;
    start = clock();
    // 計測したい処理
    for (int i = 0; i < 1000000; i++);
    end = clock();
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("CPU時間: %f秒\n", cpu_time_used);
    return 0;
}

精度の違い

time関数の精度

time 関数の精度は1秒単位です。

これは、システム全体の時間を計測するため、秒単位の精度で十分であることが多いからです。

例えば、ログのタイムスタンプや日付の表示など、秒単位の精度で問題ない場合に使用されます。

clock関数の精度

clock 関数の精度は、システムによって異なりますが、通常はミリ秒単位またはそれ以上の精度を持ちます。

これは、プロセスのCPU時間を計測するため、より高い精度が求められるからです。

特定のコードブロックの実行時間を詳細に測定したい場合に適しています。

使用シーンの違い

time関数の使用シーン

time 関数は、以下のようなシーンで使用されます。

  • 現在時刻の取得
  • ログのタイムスタンプの記録
  • 日付や時刻の表示

例えば、ログファイルにエントリを追加する際に、そのエントリがいつ記録されたかを示すために time 関数を使用します。

clock関数の使用シーン

clock 関数は、以下のようなシーンで使用されます。

  • プログラムのパフォーマンス測定
  • 特定のコードブロックの実行時間の計測
  • プロファイリング

例えば、アルゴリズムの効率を評価するために、特定の処理がどれだけのCPU時間を消費したかを測定する際に clock 関数を使用します。

以上のように、time 関数clock 関数はそれぞれ異なる目的で使用されます。

用途に応じて適切な関数を選択することが重要です。

目次から探す