簡體   English   中英

報告計算時間下的 Visual Studio 診斷工具

[英]Visual Studio Diagnostic Tools under reporting compute time

我無法共享整個代碼庫來重現該問題,但我正在使用Visual Studio 診斷工具來檢查性能,並且操作需要更長的時間來執行 CPU 使用率中報告的內容。

示例代碼

這是兩個斷點之間有問題的代碼塊的示例:

診斷入口點

分析時間

此方法中的 CPU 樣本僅表明它花費了大約1000 毫秒來執行:

CPU使用率

來電者 被叫者

輪廓

執行時間處理時間

但是,斷點之間需要將近50 秒

診斷時間表

問題

  • 什么可能導致分析時沒有顯示這么長的執行時間線?

我嘗試過的事情:

  • 重啟VS
  • 重啟機器
  • 重新加載符號
  • 緩存符號

實際上我不經常使用分析工具。 但是,總 CPU 時間並不等於總執行時間,這聽起來很有趣。 我搜索了它,我想與我的思考過程分享我的發現。

官方文檔對此有何評論?

看了這里,沒啥好說的。 然后在這里,我發現了一個非常有趣的觀點。 正如您在下面看到的那樣,文檔包含一個演示,該演示顯示了像您一樣的CPU Usage選項卡。 但是有[External Call]標記的函數,它們不是微不足道的。 文檔指出:

外部代碼是由您編寫的代碼執行的系統和框架組件中的函數。 外部代碼包括啟動和停止應用程序、繪制 UI、控制線程以及為應用程序提供其他低級服務的函數。 在大多數情況下,您不會對外部代碼感興趣,因此 CPU Usage 工具將用戶方法的外部函數收集到一個 [External Code] 節點中。

由於您的示例不包含此功能,因此它們可能在執行時間 - 總 cpu 時間之間創建了此余量。 您可以查看此鏈接,查看CPU Usage選項卡中外部代碼的調用路徑。 默認情況下它們被禁用。

圖1

但即使這種情況屬實,也不能解釋1000ms - 50s的時間差。

繼續尋找..

經過一點點搜索,我找到了這個 另一個關於分析 CPU 使用率的文檔。 他們使用的演示與您的演示非常相似,如下所示。 即使使用外部代碼,也存在近60s的差異。 這就是我開始思考的地方, Are we comparing apples with peanuts? .

圖2

在使用選項卡中顯示Total CPU [unit, %] 具體是什么單位? 在上述相同的文檔中,他們指出:

Total CPU [unit, %]在選定的時間范圍內,調用 function 和 function 調用的函數所使用的毫秒數和 CPU 百分比。 這與 CPU 利用率時間線圖不同,后者將時間范圍內的總 CPU 活動與總可用 CPU 進行比較。

好的,以毫秒為單位,我們明白了。 但它究竟代表了什么。

CPU 使用率指標

我搜索了很多,發現了這篇文章,它把我重定向到了這個發霉的文檔 它是關於Profiler Instrumentation Data的,他們指出:

時間直接執行此 function 所花費的時間(以毫秒 (msec) 或處理器周期 (ticks) 為單位),不包括此 function 調用的子函數所花費的時間。

之后,我查看了更多更新的文檔,但他們將其稱為僅毫秒,就像上面的引用一樣。 但是這個舊文檔給了我一個火花。 如果他們指的是 cpu 循環計數,這說明了一切。 它們不包括空閑 state、中斷、鎖定和帳戶中的作業優先級。 實際上,當您考慮它時,這是一件明智的事情。 CPU 以離散的方式處理函數。 這樣,您每次都可以獲得更一致的結果。

你的問題

如果我的研究正確,我認為當您開始執行時,它會記錄您的函數在 cpu 上花費的時間。 它不會在捕獲的時間內添加此事件持續時間:函數相互等待、函數等待 I/O、os 決定接管進程、高優先級進程接管、線程鎖、WINDOWS 更新......即使總捕獲時間功能是 1 1ms ,根據計算機的不同,可能需要幾分鍾才能完成任務。 CPU 執行時間是離散的,但斷點之間的時間是連續的。 這就是為什么你在它們之間有邊距。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM