2016-07-29 58 views
0

我正在使用Visual Studio來剖析我的多線程C++應用程序。 從我已閱讀的採樣方法中,我瞭解到它以指定的時間間隔查看處理器,以查看正在執行的函數。剖析多線程代碼,如何抽樣工作

我很好奇它是如何處理多線程代碼的。很有可能兩個或多個函數可能在不同核心上的不同線程上同時執行。在這種情況下,採樣方法是否爲這兩個函數增加計數器?我相信這是實際發生的事情。

這實際上很難從分析報告中獲得洞察。收集的樣本數最多的函數(如果在工作線程上執行的話)可能在不同的核心(主線程)上執行,並且可能根本不會影響應用程序性能。但是,如果要切換主線程來執行其工作,那麼它應該對性能產生可觀察的影響。

有沒有更好的方法來分析多線程代碼?

+1

是的。如果線程不影響你的應用程序的性能,那麼你做錯了,你最好不要使用它們。模爲了防止UI凍結而需要異步性,但這不是併發性。找出爲什麼多線程程序吸泥需要一種不同類型的工具,[併發分析器](https://msdn.microsoft.com/en-us/library/dd537632.aspx?f=255&MSPPError=-2147217396) 。 –

回答

1

在對函數執行進行採樣時,分析器通常會單獨對每個軟件線程進行採樣。因此,如果您有三個線程,分別執行CPU密集型foo(),bar()和baz()函數,並且採樣頻率爲100Hz,並且分析會話持續時間爲1秒,則每個會獲得100個採樣的功能。

一個體面的分析器通常也會給你一個方法來過濾給定的線程的數據,以便你可以看到哪些熱點存在於孤立的線程上。例如,如果主線程是使用您所使用的框架完成UI渲染的地方,那麼主線程上發生的情況可能會很重要。

搞清楚在後臺線程中完成的計算如何影響應用程序的響應速度本身就是一個廣泛的主題,並且通常是特定於應用程序的。一些模式:

  • 尋找主線程被阻塞的位置。它可能會阻塞等待後臺計算的結果。
  • 查看主線程是否有任何要跳過的操作,因爲它沒有可用的數據。這對於UI /渲染處理特別常見 - 如果在渲染幀時數據還沒有準備好,那麼代碼沒有任何更好的辦法可以跳過渲染框架,從而導致用戶可見的在UI中跳躍。

希望這會有所幫助。

0

有沒有更好的方法來分析多線程代碼?

我總是要問,因爲這些都是不一樣
您是否在尋找1)什麼是採取掛鐘時間,並可能被糾正,以加快應用程序,或2)諸如函數調用計數,CPU自身時間,CPU包含時間,熱路徑等各種類型的測量?

假設答案是1,許多人和我使用的方法是在Visual Studio IDE下根據需要簡單地pause the application多次。 當你這樣做,它暫停所有線程。 您可以顯示每個線程的調用堆棧。這會告訴你它等待什麼,以及爲什麼。 一個或多個線程將在暫停的一小部分時間內處於某種計算或系統等待或您可能認爲可以避免的I/O的過程中。

你可以稱之爲「窮人的仿形」, 但這裏是它如何超越探查輸出:

  • 你不必關心的問題是計算或I/O,或猜測它是什麼,並選擇不同的分析方法。無論哪種方式,你看到它。

  • 如果您想知道在函數/方法中花費的時間的包含分數,粗略地說,它是函數在堆棧上的樣本的分數。任何代碼行也是如此。 如果您想知道獨佔(自)分數,那麼函數或代碼行位於堆棧的端點處。

  • 如果你想知道分數的時間都花在與功能的調用函數B,它是樣品的部分如果你是通過中介感興趣處於呼叫乙其中A調用B. ,你也可以看到(沒有調用圖可以告訴你)。

  • 假設堆棧是30層深的,以一些I/O結束,並且您想知道代碼的哪個部分導致它執行該操作,只需掃描堆棧,查看每行代碼你找到它。 請注意,這可能不是「熱門路徑」,因爲可能存在多種獲取問題代碼的方法。

  • 當您這樣做時,您不僅可以看到負責的代碼行,還可以檢查相關數據變量的值。 探查器無法向您顯示這些;你必須猜測。

  • 它不會浪費你的時間告訴你很多東西是而不是問題,因爲它們佔用很小的百分比。 (有時候人們認爲他們只是在尋找小的東西,比如5%或者更少的東西,而使玫瑰色的假設沒有什麼更大的東西。一個探查器可以讓人做出這個假設,因爲用它你不能看到更大)

  • 它允許你專注於你可以做些什麼的代碼,你的代碼,而不是系統代碼。

  • 您不必通過時間線尋找感興趣的時間間隔。 當你讓你等待時,你會暫停它;任何時候都很難暫停。所以它會告訴你爲什麼它讓你等待。