0

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

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

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

我已经尝试过非常困,但我无法访问我想要访问的功能;他们没有表现出来。我希望能够看到使用库函数 (SDL) 的我自己编码的函数的使用百分比,但它只会显示 SDL 函数。

4

1 回答 1

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

我当然已经使用了所有这些函数,并且由于函数相当大,所以长时间运行,它不应该增加太多开销。

您也可以一次测量多个函数,例如,如果我们想要拥有整个函数,我们可以将枚举“BIG_FUNC”添加到上面的枚举列表中,然后执行以下操作:

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

    ... 
    END(BIG_FUNCTION);
    report();
}
于 2012-12-31T21:54:02.277 回答