2016-05-12 53 views
0

如何可視化常規調用堆棧並計算內部和外部執行時間非常明顯。但是,如果有人處理過協程,調用堆棧看起來可能非常混亂。我的意思是說,協程可能不會執行到它的父節點,而是執行到另一個協程(例如greenlet)。是否有一些常見的方法可以爲這種情況制定一致的分析輸出結果?有沒有一些常用的技術來分析基於協程的代碼?

回答

1

想想同一時間所有線程的堆棧的單個樣本。

你需要知道的是 - 誰在等誰,爲什麼。 通常情況下,如果函數A在棧上高於B,則意味着A正在等待B返回,原因是A希望B做某事。 如果您查看整個堆棧,對於一個線程,您會看到該線程爲什麼要花費特定納秒的一系列原因。 如果你正在尋找速度,你正在尋找一系列原因,總而言之,你並不需要(因爲有一個薄弱環節)。 即使鏈條在I/O中結束,也可以使用。 如果是用戶輸入,它只是等待用戶。 但是,如果它是輸出或磁盤I/O或普通的舊CPU啓動,您可能可以採取一些措施來減少它,並獲得性能提升(如果您在兩個或更多的示例中看到同樣的問題)。

如果線程A正在等待線程B呢? 然後你在A棧的底部看到的是一個等待另一個線程的函數。 你需要弄清楚哪個是線程B,並且看它的堆棧,因爲更長的它需要更長的A。 所以這很難,但是你肯定不會害怕這個。

我在這裏談論的是手動分析,您可以在調試器中自己抽取樣本,並充分注意每個樣本。 分析工具傾向於認爲你很懶,只想要數字,如果沒有任何東西跳出這些數字,你會很高興,因爲你什麼也沒有發現。事實上,如果一些愚蠢的不必要的活動花費了30%的時間,那麼平均來說,你需要看兩次的樣本數量是2/0.3 = 6.67個樣本(不是一個大數字),並且很可能是你會看到它和the profiler will not。 這就是random pausing

相關問題