2012-12-31 21 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