ユーニックス総合研究所

  • home
  • archives
  • c-second-count

C言語で秒数カウントする方法【clock(), sleep()】

  • 作成日: 2022-06-01
  • 更新日: 2023-12-25
  • カテゴリ: C言語

C言語で秒数カウントする方法

C言語で秒数をカウントしたい場合があります。
そういう時は<time.h>clock()関数を使います。

この記事ではclock()を使った秒数のカウント方法について解説します。

関連記事

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】

clock()関数とは?

clock()関数はプログラム実行からの経過時間(プロセッサ時間)を返す関数です。

#include <time.h>  

clock_t clock(void);  

clock()の返す経過時間を秒数に変換する場合は、clock()の結果をCLOCKS_PER_SEC定数で割る必要があります。

#include <stdio.h>  
#include <time.h>  

int main(void) {  
    clock_t time = clock();  

    printf("秒数: %f\n", (double)time / CLOCKS_PER_SEC);  
    // 秒数: 0.000831  
    return 0;  
}  

clock()で秒数をカウントする

clock()の返り値をCLOCKS_PER_SECで割れば秒数は求まります。
しかしこれはプログラム開始からの経過時間になります。

特定の処理の間で経過時間を秒数でカウントしたい場合は、↓のように処理を書きます。

  • clock()で計測開始時間を取得する
  • clock()で経過時間を取得する
  • 開始時間と経過時間の差分を取る

このような流れで処理を書くと、経過時間を秒数でカウントできます。
↓のようにコードを書きます。

#include <stdio.h>  
#include <time.h>  

int main(void) {  
    // カウントする秒数  
    double total_sec = 10;   

    // 計測開始時間を取得する  
    clock_t start = clock();  

    for (;;) {  
        // 経過時間を取得する  
        clock_t end = clock();  

        // 差分を取り秒数に変換する  
        double sec = (double)(end - start) / CLOCKS_PER_SEC;  

        if (sec >= total_sec) {  
            break;  
        }  
    }  

    printf("%f秒カウントしました。\n", total_sec);  

    return 0;  
}  

上記のコードを実行すると↓のような結果になります。

10.000000秒カウントしました。  

まず

    // カウントする秒数  
    double total_sec = 10;  

でカウントしたい秒数を定義しておきます。
それから

    // 計測開始時間を取得する  
    clock_t start = clock();  

で計測開始時間を取得します。
そしてループを回します。
ループの中では

        // 経過時間を取得する  
        clock_t end = clock();  

で経過時間を取得します。
そして計測開始時間と経過時間の差分を取り、秒数に変換します。
end - startになってることに注意してください。
これはendstartよりも常に大きい値だからです。

        // 差分を取り秒数に変換する  
        double sec = (double)(end - start) / CLOCKS_PER_SEC;  

最後に待機した秒数を出力して終わりです。

    printf("%f秒カウントしました。\n", total_sec);  

このプログラムを実行すると10秒間カウントします。

clock()で1秒ごとにカウント表示をする

1秒経過するごとに画面に秒数を出力したい場合もあると思います。
そういう場合はclock()を応用して↓のような処理を書きます。

#include <stdio.h>  
#include <time.h>  

int main(void) {  
    double count = 1;  // 秒数カウンター  
    clock_t start = clock();  

    for (;;) {  
        clock_t end = clock();  // 経過時間を取得  
        double sec = (double)(end - start) / CLOCKS_PER_SEC;  // 差分を秒数に変換  

        // 経過秒数が現在のカウンター以上だったら  
        if (sec >= count) {  
            printf("%f秒経過\n", sec);  // 経過秒数を出力する  
            count += 1;  // カウンターを増加する  
        }  
    }  

    return 0;  
}  

↑のコードを実行すると↓の結果になります。

1.000000秒経過  
2.000000秒経過  
3.000000秒経過  
4.000000秒経過  
5.000000秒経過  
6.000000秒経過  
7.000000秒経過  
8.000000秒経過  
9.000000秒経過  
10.000000秒経過  
...  

このコードでは経過秒数にsecを使っているのがコツです。
secはちゃんとした経過秒数が求まります。
countは1秒ごとにsecを表示するために利用するカウント変数です。
count自体は先読みする秒数で正確な秒数ではありません。

sleepで秒数をカウントする

<unistd.h>sleep()で秒数をカウントすることもできます。
ただしこのsleep()を使った方法は、余計な処理が間にあるとカウントがずれる場合があります。

#include <unistd.h>  
#include <stdio.h>  

int main(void) {  
    long sec = 0;  

    for (;;) {  
        sleep(1);  
        sec++;  

        printf("%ld秒経過\n", sec);  
    }  

    return 0;  
}  

sleep()は引数の秒数だけプログラムを休ませます。
このsleep()以外の処理に時間がかかると、指定の秒数 + α の時間がかかります。
ですので正確な処理を行いたい場合はsleep()は使わないほうがいいでしょう。

またsleep()clock()と競合することもあります。
sleep()clock()を同時に使う場合は注意が必要です。
筆者の環境(Windows WSL2 Ubuntu)ではsleep()を使うとclock()で期待した経過時間を得られませんでした。

おわりに

今回はC言語で秒数カウントする方法を解説しました。
clock()sleep()も秒数をカウントする場合は他に処理があるとその処理の分だけ処理時間が増えます。
ですのでこの点に注意して計測する必要があります。

🦝 < clockで秒数カウント

🐭 < 1..2..3..