测量新/旧代码在特定功能上的CPU使用情况



长话短说,我正在重新编写一个非常需要CPU的应用程序,将以一种完全不同的方式重组它,并改变它的许多内部工作方式。我在寻找一种比较新旧结果的好方法。

假设我从改变函数foo()的工作方式开始:

我想让程序运行60秒,并测量该函数在程序总CPU使用中使用的CPU百分比。如果它是恒定的25%我想知道这25%中有多少是函数。然后我在更改代码后进行测试,并且有两个很好的指标来表明我是否有了很好的改进。

我试过Very Sleepy,但我无法访问我想要访问的函数;他们没有表现出来。我希望能够看到我自己编写的使用库函数(SDL)的函数的使用百分比,但它只会显示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();
}

我确实使用了所有这些函数,并且由于这些函数的运行时间相当长,因此应该不会增加太多开销。

你也可以一次测量几个函数,例如,如果我们想要有一个WHOLE函数,我们可以把枚举"BIG_FUNC"添加到上面的枚举列表中,然后这样做:

void big_function()
{
    START(BIG_FUNCTION);
    START(FUNCA);
    funca();
    END(FUNCA);
    START(FUNCB);
    funcb();
    END(FUNCB)
    ... 
    END(BIG_FUNCTION);
    report();
}

最新更新