今回はVisualStudioのReleaseモードにおける時間計測の方法を知りたく質問させていただきました。
開発にはVisualStudio2013 , 言語はC++を利用しています。
まず初めに、一般的にプログラムの特定の処理時間を知りたい場合は、
というように、時間計測関数を上下に挿入すると思います。
私も今まで処理時間を知りたいときはDebugモードの状態でいつもこの方法を使用してきました。
しかしDebugモードではなくReleaseモードで動かさなければ
実際のアプリケーション動作中での正確な処理時間が測れないのではないかと思い、Releaseモードに切り替えてみたところ、
特定の処理に置いては処理時間が常に0を示すような結果となりました。
以下に処理時間を図るソースコード[1] , 時間を図る対象となる処理A[2] , 時間を図る対象となる処理B[3]をお載せします。
処理時間を測るソースコード[1]
QueryPerformanceFrequency(&freq_pc);
QueryPerformanceCounter(&start_pc);
int count = 0;
for(int i = 0; i < 10000000; i++){
/*任意の処理*/
FuncA(i); //(またはFuncB());
}
QueryPerformanceCounter(&end_pc);
double millSec = (((double)end_pc.QuadPart - (double)start_pc.QuadPart) / (double)freq_pc.QuadPart) * 1000;
unsigned long FuncB(){
static unsigned long x = 123456789;
static unsigned long y = 362436069;
static unsigned long z = 521288629;
static unsigned long w = 88675123;
static unsigned long t = 0;
t = (x ^ (x << 11));
x = y;
y = z;
z = w;
return(w = (w^(w >> 19)) ^ (t^(t>>8)));
}
以降は今回の原因を調べているときに気が付いたことになります。
・start_pc.QuadPart , end_pc.QuadPart , freq_pc.QuadPartの値も表示させてみたところ、0以外の数値を取得できていたため、
QueryPerformanceFrequency(&freq_pc);とQueryPerformanceCounter(&start_pc);の関数は動作している。
しかし、常にstart_pc.QuadPartとend_pc.QuadPartの値が一致しているため、FuncAの計測時間が0になる。
・最適化の関係でfor文の中身が実行されていないのではないかと思い、for文の中でcount変数をインクリメントしたところ、
for文で回した数だけの値が出力されたため、for文内部をスキップしているわけではない。
・処理の実行時間はかなり短いが、1億ループ回して処理時間が1マイクロ秒以内に収まるとは考えられない。
・時間計測関数で、TimeGetTime()やclock()関数も用いてみたが、いずれもFuncAの計測時間が0.00となった。
長文になってしまい申し訳ありませんでしたが、まとめますと、
「Releaseモードでも正確な実行時間を取得できる方法」と「可能であれば今回のような問題が起こる原因も知りたい」ということです。
どうかご教授お願いします。