我無法真正得到this question的答案,所以我會嘗試編寫一個自定義的簡單剖析器。只是爲了開始:假設我需要找出,沒有重新編譯,多少(和哪個)核心運行我的代碼。假設我也想捕獲一個給定的函數執行。最後,關於處理線程的任何想法?有關如何開始的任何其他提示? C是我選擇的語言,我正在運行Linux。謝謝。構建您自己的分析器:如何捕獲事件?
編輯:我分析過的Oprofile,CallGrind,Helgrind,gprof,papi,tau和其他人似乎並不符合我的需求。
我無法真正得到this question的答案,所以我會嘗試編寫一個自定義的簡單剖析器。只是爲了開始:假設我需要找出,沒有重新編譯,多少(和哪個)核心運行我的代碼。假設我也想捕獲一個給定的函數執行。最後,關於處理線程的任何想法?有關如何開始的任何其他提示? C是我選擇的語言,我正在運行Linux。謝謝。構建您自己的分析器:如何捕獲事件?
編輯:我分析過的Oprofile,CallGrind,Helgrind,gprof,papi,tau和其他人似乎並不符合我的需求。
你應該試試linux的perf https://perf.wiki.kernel.org/index.php/Tutorial 這個工具直接支持內核,並且知道頁面錯誤,CPU遷移,上下文切換(例如看看perf stat
輸出)。這些統計信息可以按每個進程或每個cpu彙總。可以像oprofile一樣使用perf record
。
爲了添加簡單的配置文件,您可以使用setitimer
(採樣信號爲進程範圍)或timer_create
(可爲線程安裝定時器信號)。您無法直接獲取有關線程使用的物理CPU編號的信息,但是在每個樣本中,您可以使用getrusage
和RUSAGE_THREAD
執行線程運行時間。
我敢肯定you've seen this之前。
我發現它有助於區分兩個不同的目標:
測量長的各種事情怎麼走,所以你可以做一個介紹。作爲本演示文稿的一部分,您可能會這樣說:「看起來像例行程序佔用了太多時間,或者被調用了太多時間,我們試圖加快速度,或者稱之爲更少時間。」
查明精確的代碼或指令行是1)沒有必要,2)值得修復,因爲它們將節省很多的執行時間。
我懷疑整體目標是後者。 但要做到這一點,測量是一種非常間接的方法。相反,你可以利用這樣一個事實,即如果有什麼東西浪費了足夠的時間值得看,你可以簡單地通過拍攝來獲取程序狀態的快照。
所以你不測量,以找到需要的時間。 事實上,它需要時間是明確無誤地揭示它,沒有暗示參與。
Zoom is a profiler以這種方式工作。 So is LTProf。 我建了一個,但坦率地說,我認爲手動方法,而更多的工作,is more effective,因爲它讓我更難以思考爲什麼該程序正在做它做的。
謝謝,邁克。雅,我會看到你鏈接到的第一個答案。我並不想通過尋找瓶頸的常識來進行配置。它是**線程**,我想要配置文件:它們在哪裏執行,它們的狀態(R,S,...),CPU消耗的數量等等。我想要一個線程的總體圖。我明白你的意思。這是我迄今爲止所做的工作(我從事算法研究),並且我想要有一個更通用的解決方案:我編寫一個30位的LOC算法,並且分析會添加另一個100+的LOC!謝謝。 –
噢,我還需要隨着時間的推移找到這些信息。 –
@Dervin:'lsstack'或'pstack'是否提供你想要的信息?它可以在一個單獨的進程中循環運行。 –
你有什麼需求?請詳細解釋它們,甚至可以舉個例子,你想得到什麼。這是因爲您列出了所有流行的配置文件「不符合您的需求」。 – osgx
對,對不起。所以,我想每個線程:例如,時間,tid,cpu運行,線程狀態。 –
是否需要「樣本」,例如每1毫秒檢查一次,如果CPU上的線程和哪個功能處於活動狀態? – osgx