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

时间:2012-12-31 21:34:48

标签: c++ windows function timer profile

长话短说,我正在重新编写一个非常耗费CPU的应用程序,以完全不同的方式对其进行重组,并改变它的内部工作方式。我一直在寻找比较新旧结果的好方法。

假设我首先改变函数foo()的工作原理:

我希望让程序运行60秒,并在程序的总CPU使用率内测量该函数正在使用的CPU百分比。如果它是25%的常数,我想知道这25%中有多少是我的功能。然后我会在更改代码后进行测试,并有两个很好的指标,表明我是否有一个很好的改进。

我已经尝试Very Sleepy但我无法访问我想要访问的功能;他们没有表现出来。我希望能够看到使用库函数(SDL)的函数I CODED MYSELF的%用法,但它只显示SDL函数。

1 个答案:

答案 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();
}