2012-12-31 86 views
0

长话短说,我正在重新编写一个非常CPU饿的应用程序,将重组其在一个完全不同的方式,并改变了很多它的内部运作。我正在寻找一种比较新旧结果的好方法。测量新/旧代码的CPU占用率,对特定功能

说我通过更改功能foo()工程启动:

我想有发言权,60秒程序运行,并且测量功能程序的CPU使用总量中使用的CPU%。如果它是25%,我想知道这些25%中有多少是我的功能。然后我会在更改代码后进行测试,并有两个很好的指标,说明我是否有很好的改进。

我已经试过Very Sleepy但我不能获得我想要访问的功能;他们不显示。我希望能够看到使用库函数(SDL)的函数I CODED MYSELF的%使​​用率,但它只会显示SDL函数。

+1

标记您的工作操作系统。 –

+0

已经由别人完成了,很好的通话。 – GigaBass

回答

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

这很完美,谢谢!与程序本身相比,我该如何测量1(或几个)函数的时间?为了获得某种半精确的%值? 一旦程序启动,我应该添加一个定时器,程序结束时关闭定时器,然后执行functionTime/programTime x 100?因为我也在整个程序中睡觉(),它会不会干扰? – GigaBass

+0

我从来不担心总体时间,因为我通常只是用unix命令粗略地测量“时间”,或者某些时间(时间给出了用户和内核模式下的实时总时间和CPU时间,所以非常方便整体时间计算)。 我会再次展示另一个小窍门,编辑... –

+0

非常感谢您,再次感谢您!祝你新年快乐! :) – GigaBass