长话短说,我正在重新编写一个非常耗用 CPU 的应用程序,打算以一种完全不同的方式重组它,并改变它的很多内部工作方式。我一直在寻找一种比较新旧结果的好方法。
假设我从改变函数 foo()
的工作方式开始:
我想让程序运行 60 秒,并测量该函数使用的 CPU 在程序总 CPU 使用率中所占的百分比。如果它是恒定的 25%,我想知道这 25% 中有多少是我的功能。然后我会在更改代码后进行测试,并有两个很好的指标来判断我是否有很好的改进。
我试过了 Very Sleepy但我无法访问我想要访问的功能;他们没有显示。我希望能够看到使用库函数 (SDL) 的 I CODED MYSELF 函数的使用百分比,但它只会向我显示 SDL 函数。
最佳答案
有几种不同的方法,其中一种是在函数的开始和结束处简单地添加高精度计时器调用。根据函数的调用次数,您可以累积时间,例如:
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();
}
我肯定已经使用了所有这些函数,并且只要函数相当大就可以长期运行,它应该不会增加太多开销。
您还可以同时测量多个功能,例如如果我们想拥有整个功能,我们可以将枚举“BIG_FUNC”添加到上面的枚举列表中,然后执行以下操作:
void big_function()
{
START(BIG_FUNCTION);
START(FUNCA);
funca();
END(FUNCA);
START(FUNCB);
funcb();
END(FUNCB)
...
END(BIG_FUNCTION);
report();
}
关于c++ - 在特定功能上测量新/旧代码 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14106225/