2011-04-01 52 views
3

我在儀器時間分析器中有一個相對較長的功能。有沒有辦法給這個函數添加額外的符號,這樣抽樣會顯示分配給函數不同部分的時間?我正在尋找類似於(1)年前教授存在的MARK宏。如何在使用儀器時間分析器時細分功能

回答

6

使用宏:

#define MARK(K) asm("M."#K":"); 

已經爲我運作良好。這實際上只是我在原始問題中提到的舊MARK宏的簡化。放置MARK(LOOP1);函數中的某處將添加一個新符號M.LOOP1,該符號將顯示在由鯊魚或樂器顯示的函數列表中。

1

我聽說鯊魚能做到這一點,所以儀器也應該,但你必須告訴它做什麼:

  • 做採樣,對掛鐘時間(不只是CPU時間) ,函數調用堆棧(不只是程序計數器PC)。

  • 告訴你在很多堆棧樣本中出現的代碼行(不僅僅是函數)。

一個堆棧樣本包括PC和每個調用指令導致PC在哪裏。 堆棧中的每條指令都共同負責這段時間。

因此,任何負責X%時間的代碼行都會佔用堆棧X%的時間。如果它足夠大,值得一看,你會在樣本上看到它。你可能會得到很多樣品,但實際上並不需要太多。這是因爲定位問題比測量精度要更重要。

如果您最大的問題是固定的,可以爲您節省5%,它會出現在約5%或更多的樣本上。如果它小於這個值,那麼你的代碼非常優化。機會比這大得多,所以你不會有任何困難,看到它在哪裏。

添加:一個分析器的例子,牆壁時間堆棧採樣和逐行顯示是Zoom,所以我建議你看那個視頻。然後,嘗試讓樂器做同樣的事情。

+0

Shark將執行每行報告,但我希望能夠調整粒度並獲取我指定的代碼段的報告。它不會出現儀器可以進行每行報告。 – Scott 2011-04-03 19:48:51

+0

@Scott:真的嗎?我認爲樂器是鯊魚等等的一切。如果他們剔除每一行的報告,我很困惑。在任何情況下,我依賴的方法是[random-pausing](http://stackoverflow.com/questions/375913/what-c​​an-i-use-to-profile-c-code-in-linux/378024# 378024)。您可能需要調整粒度,但我會建議真正起作用的方法是堆棧的掛鐘時間(而非CPU)採樣。我看單個樣本(並且不需要太多),並查看多個樣本上顯示的線條。 – 2011-04-03 22:01:06

1

UPDATE:

我已經更新了代碼,並創建一個單獨的項目:

https://github.com/nielsbot/Profiler


我有一些代碼,可以在這裏做到這一點:我有一些代碼,你可能會魚翅在這裏可以這樣做:https://gist.github.com/952456 HTH

你可以使用這樣的代碼來剖析你的函數的部分:

-(void)myMethod 
{ 
    ProfilerEnter(__PRETTY_FUNCTION__); 

    // ... code ... 
    { 
     ProfilerEnter("operation x"); 

     // your code here 
     // ... 

     ProfilerExit("operation x"); 
    } 

    ProfilerExit(__PRETTY_FUNCTION__); 
}