秒以上の精度を簡単に取得できるようにする工夫2008年12月16日 02時55分57秒

プログラムでは時折、一部の処理に異常な時間が掛かるようになることもある。そのような場合、デバッガを使うとプログラムの実行速度が遅くなるので、問題が見えなくなる場合もある。

ただ単に全体的な遅さを処理するのであれば、解析プログラムなども使えるのだが、特定の部分だけを探す時は、一筋縄ではいかない事もある。また、解析プログラムを設定する手間も、掛かる事もある。

そうなると、デバッグ用の出力が比較的手軽になってくる。しかし、ミリ秒単位、またはそれ以上の精度の時間を取得するには、複数の呼び出しが必要で、面倒になることが多々あった。

そこで、とった方法がこれ。デバッグを始めるときに以下のコードを一番良く使われるヘッダーファイルに入れてしまう。今回のはミリ秒での時間を取得。


#ifndef UYOTA
#define UYOTA
extern "C" {
#include <sys/time.h>
static long uyota()
{
   struct timeval timeval; struct tm tm;
   gettimeofday(&timeval,NULL);
   localtime_r(&timeval.tv_sec, &tm);
   return long (tm.tm_sec*1000 + timeval.tv_usec/1000);
}
}

#endif

C++ だったらそのまま、C だったら extern を取り除く。関数が static に宣言されるので、読み込まれるファイル毎にこの関数が存在する事になるが、どうせ一時的なもの。これで、他の正しい流儀の関数のような手間も掛からず簡単に使えるようになる。

また、一時的にのみ入れるデバッグ関数やテスト用のプログラムに特別な裏口を作る場合などには、いつも自分の名前を組み込む様にしている。一時的なデバッグ関数入り場合はファイルごと消してしまう場合も多いが、ファイルを比較したりする場合に、目立つので作業がやりやすい。また、誰かが裏口を調べたい時には、自分の名前を探すように言えるので、簡単に見付けてくれる。