マツケンのマインド

とある理系大学生のブログです。基本は勉強とつぶやきとまとめです。

C言語における時間計測方法➁

こんにちは!マツケンです!

今回は以下に挙げる時間計測方法を少しアップグレードしたものを書いていきます。

matsuken-jory.hatenablog.jp

はじめに

 現在、投稿している「プロジェクトオイラー」や大学でのプログラミングの課題を行い、考察などするときに、「やべー...どっちも0.0000000秒やん...何書こう。」となることがかなり多くなりました。
また、下の記事を書いたときに「printf関数の出力回数」が時間に大きく影響する場合があります。
matsuken-jory.hatenablog.jp

今回はこれらの問題を解決する方法を書き残します。

計測時間が0.000000...のように所要時間がかなり短いケース

 コンピュータは速く計算できてしまうものは何度やっても早く終わります。また、扱える数字の桁数が限られるため、大きい数を測定時間にかけるという手法を思いつかれる方もいらっしゃると思いますが、誤差がかなり大きくなります...
では
「時間計測したい部分を何度もループさせることで、わざと長い時間をかけて処理を行わせ、ループ回数で割る」というのはいかがでしょうか?

ソースコード

#include <stdio.h>
#include <time.h>
#define LOOP 1000000 // ループさせたい回数

int func(a, b){ // 時間計測したい関数
…
}

int main(void){
    clock_t start, end; // 毎度毎度の変数
    double time;
    int a, b;
    ...
    start = clock(); // 計測開始の時間を取得
    for (int k=0; k<LOOP; k++)
        func(a,b);
    end = clock(); // 計測終了時の時間を取得

    time = (double)(end –start)/CLOCKS_PER_SEC/LOOP; // LOOPで割ることで一回の実行時間が求まる。
    printf(“一回当たりの計測時間: %lf [sec]\n”, time);
    return 0;
}

単位は調整可能なので、柔軟に変更できます。

「printf関数の出力回数」が時間に大きく影響する場合

 この場合は、printfをコメントアウトすることで、printfに要する時間を計測せずに済みます!

...
printf("この状態はコメントアウトできてない\n");

// printf("この状態はコメントアウトできている!\n");
/* printf("この状態もコメントアウトできている!\n"); */
...

これをマスターして、考察を書きやすくしよう!