长话短说,我正在重新编写一个非常耗费CPU的应用程序,以完全不同的方式对其进行重组,并改变它的内部工作方式。我一直在寻找比较新旧结果的好方法。
假设我首先改变函数foo()
的工作原理:
我希望让程序运行60秒,并在程序的总CPU使用率内测量该函数正在使用的CPU百分比。如果它是25%的常数,我想知道这25%中有多少是我的功能。然后我会在更改代码后进行测试,并有两个很好的指标,表明我是否有一个很好的改进。
我已经尝试Very Sleepy但我无法访问我想要访问的功能;他们没有表现出来。我希望能够看到使用库函数(SDL)的函数I CODED MYSELF的%用法,但它只显示SDL函数。
答案 0 :(得分:3)
有几种不同的方法,其中一种方法是在函数的开头和结尾添加一个高精度的定时器调用。根据您对函数的调用次数,您可以累积时间,例如:
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的调用处于功能中,那么您需要以某种方式折扣。
另一种方法是测量几个函数的个别时序:
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();
}