[英]Visual Studio Diagnostic Tools under reporting compute time
我無法共享整個代碼庫來重現該問題,但我正在使用Visual Studio 診斷工具來檢查性能,並且操作需要更長的時間來執行 CPU 使用率中報告的內容。
這是兩個斷點之間有問題的代碼塊的示例:
此方法中的 CPU 樣本僅表明它花費了大約1000 毫秒來執行:
但是,斷點之間需要將近50 秒
實際上我不經常使用分析工具。 但是,總 CPU 時間並不等於總執行時間,這聽起來很有趣。 我搜索了它,我想與我的思考過程分享我的發現。
看了這里,沒啥好說的。 然后在這里,我發現了一個非常有趣的觀點。 正如您在下面看到的那樣,文檔包含一個演示,該演示顯示了像您一樣的CPU Usage
選項卡。 但是有[External Call]
標記的函數,它們不是微不足道的。 文檔指出:
外部代碼是由您編寫的代碼執行的系統和框架組件中的函數。 外部代碼包括啟動和停止應用程序、繪制 UI、控制線程以及為應用程序提供其他低級服務的函數。 在大多數情況下,您不會對外部代碼感興趣,因此 CPU Usage 工具將用戶方法的外部函數收集到一個 [External Code] 節點中。
由於您的示例不包含此功能,因此它們可能在執行時間 - 總 cpu 時間之間創建了此余量。 您可以查看此鏈接,查看CPU Usage
選項卡中外部代碼的調用路徑。 默認情況下它們被禁用。
但即使這種情況屬實,也不能解釋1000ms - 50s
的時間差。
經過一點點搜索,我找到了這個。 另一個關於分析 CPU 使用率的文檔。 他們使用的演示與您的演示非常相似,如下所示。 即使使用外部代碼,也存在近60s
的差異。 這就是我開始思考的地方, Are we comparing apples with peanuts?
.
在使用選項卡中顯示Total CPU [unit, %]
。 具體是什么單位? 在上述相同的文檔中,他們指出:
Total CPU [unit, %]在選定的時間范圍內,調用 function 和 function 調用的函數所使用的毫秒數和 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.