いくつかの方法がありますが、そのうちの 1 つは、関数の最初と最後に高精度のタイマー呼び出しを追加することです。関数の呼び出し回数に応じて、次のように時間を累積できます。
typedef type_of_time_source tt;
tt total = 0;
void my_func(....)
{
tt time = gettime();
... lots of your code ...
time = gettime() - time;
total += time;
}
または、個々の間隔を保存することもできます。
tt array[LARGE_NUMBER];
int index = 0;
... same code as above ...
time = gettime() - time;
if (index >= LARGE_NUMBER) index = 0; // [or LARGE_NUMBER-1?]
array[index++] = time;
もちろん、SDL への呼び出しが関数の途中にある場合は、何らかの方法でその時間を割り引く必要があります。
もう 1 つの方法は、いくつかの関数の個々のタイミングを測定することです。
enum {
FUNCA,
FUNCB,
....
MAX_TIMINGS
}
struct timing_val
{
tt start, end;
char *name;
}
struct timing_val timing_values[MAX_TIMINGS];
#define START(f) do { timing_values[f].name = #f; timing_values[f].start = gettime(); } while (0);
#define END(f) do { timing_values[f].end = gettime(); } while(0);
void report()
{
for(int i = 0; i < MAX_TIMING; i++)
{
if (timing_values[i].start == 0 && timing_vlaues[i].end
cout << timing_values[i].name <<< " time = " <<
timing_values[i].end - timing_values[i].start << endl;
}
}
void big_function()
{
START(FUNCA);
funca();
END(FUNCA);
START(FUNCB);
funcb();
END(FUNCB)
...
report();
}
私は確かにこれらすべての関数を使用してきました。関数が適度に大きいため長時間実行されるため、オーバーヘッドが大きくなることはありません。
一度に複数の関数を測定することもできます。たとえば、WHOLE 関数が必要な場合は、上記の列挙型リストに列挙型 "BIG_FUNC" を追加して、次のようにします。
void big_function()
{
START(BIG_FUNCTION);
START(FUNCA);
funca();
END(FUNCA);
START(FUNCB);
funcb();
END(FUNCB)
...
END(BIG_FUNCTION);
report();
}