當前位置:
首頁 > 最新 > 溫故之.NET性能分析

溫故之.NET性能分析

此文包含以下內容

運行時分析

性能計數器

其他性能分析工具

運行時分析

使用跟蹤性能,即性能監視器(Performance Monitor)

它是自帶的一款分析應用程序的工具,它以圖形的方式來表示從內存管理到JIT性能的方方面面。通過它,我們也可以知道我們應用程序所使用的資源的情況。

通過 的方式,喚出命令提示符工具。在輸入框中輸入 (在Windows10裡面,如果在開始菜單出輸入,一定要輸入全部字元,否則敲回車時可能運行的是系統推薦的應用),然後回車即可,如下:

Win + R

回車後:

性能監視器

然後,點擊左側欄中【監視工具】下的【性能監視器】, 得到如下圖形:

性能監視器

點擊右側面板中的「綠色加號」,以添加計數器,如下

添加計數器

可以看到, 應用程序有許多預定義的對象,包括用於內存管理()、互操作性()、異常處理()以及多線程處理()的計數器等多種工具。

點擊列表中項目右邊的「向下箭頭」,可以查看該性能對象能夠支持的計數器

單擊要查看的性能計數器。

在《選定對象的實例》列表框中,單擊,指定要在全局(也就是在整個系統範圍內)監視CLR的性能計數器。也可以在《選定對象的實例》列表框中,單擊要監視該應用程序的性能計數器的應用程序的名稱。

選擇了對象實例之後,點擊對話框右下方的【確定】按鈕,既可以完成添加。

步驟如下圖:

步驟

以編程方式讀取和創建性能計數器

除了以上通過其他工具的方式外,我們也可以在某些情況下(比如只需要測試某一段代碼的性能的時候)使用代碼的方式來處理,這種情況下,用代碼或許更加高效。

.NET 為我們提供了以下類(命名空間)來做這些事情

:表示 性能計數器組件。使用此類可讀取現有的計數器,或自定義更合適的計數器。也可以向自定義計數器寫入性能數據

: 提供與計數器交互的一些方法

:用於指定 組件的安裝程序

:指定計算下一個值()使用的公式

示例代碼如下:

性能計數器

這個小節將對這個計數器列表中很常用的計數器進行簡要說明

計數器

包括以下計數器:

異常性能計數器

互操作性能計數器

JIT 性能計數器

載入性能計數器

鎖定和線程性能計數器

內存性能計數器

聯網性能計數器

安全性能計數器

異常性能計數器

類別包含的計數器提供應用程序引發的異常的相關信息

引發的異常數: 從應用程序啟動以來引發的異常總數。此數值包括異常和轉換為異常的非託管異常(例如,從非託管代碼返回的在託管代碼中會被轉換為異常)。

引發的異常數/秒: 顯示每秒引發的異常數,它包括已處理和未經處理的異常。此計數器是一個潛在性能問題(如果引發較多數目 的異常)的指示器。

篩選次數/秒:顯示每秒執行的 異常篩選次數。

數量/秒:顯示每秒執行的 塊的數量。特別注意的是,此計數器只計算有異常執行的 塊(即拋出異常之後),不計算正常代碼路徑上的 塊。

捕獲的深度/秒:顯示從引發異常的幀到處理該異常的幀每秒遍歷的堆棧幀數。

互操作性能計數器

(互操作)類別包括的計數器提供應用程序與組件、服務和外部類型庫交互的相關信息

數目:它顯示非託管 代碼所引用的託管對象數。 是指正在從非託管 客戶端引用的託管對象的代理

封送處理次數:顯示從應用程序啟動以來,將參數和返回值從託管代碼封送至非託管代碼(反之亦然)的總次數

存根數:顯示由公共語言運行時創建的當前存根數。存根負責在 互操作調用或 調用期間將參數和返回值從託管代碼封送至非託管代碼(或反之)

JIT 性能計數器

類別包括的計數器提供的由編譯相關信息

編譯的位元組數:從應用程序啟動以來,由實時 () 編譯器編譯的微軟中間語言 () 位元組總數

編譯的方法數:從應用程序啟動以來T JIT` 編譯的方法

所佔時間百分比:顯示自上次編譯階段以來編譯所用運行佔用時間的百分比

每秒編譯的位元組數:顯示每秒編譯的位元組數

失敗數:自應用程序啟動以來編譯器編譯失敗的方法的高峰數量

載入性能計數器

(載入)類別包括的計數器提供已載入的程序集、類和應用程序域的相關信息

載入程序堆中的位元組數:所有應用程序域中類載入程序當前提交內存大小(以位元組為單位)

當前 數:應用程序中載入的應用程序域數量

當前程序集數:當前運行的應用程序中所有應用程序域範圍內已載入的程序集數量。如果程序集以非特定於域的形式從多個應用程序域中載入,則此計數器只遞增一次

當前已載入的類:所有程序集中已載入類的數量

速率:每秒載入的應用程序域的數量

卸載 的速率:每秒卸載的應用程序域的數量

程序集速率:所有應用程序域範圍內每秒載入的程序集數量。如果程序集以非特定於域的形式從多個應用程序域中載入,則此計數器只遞增一次

載入類的速率:所有程序集中每秒載入的類的數量

載入失敗的速率:每秒載入失敗的類的數量。載入失敗的原因有很多,例如安全性不夠或格式無效等等

載入失敗總數:自應用程序啟動以來載入失敗的類的峰值

總數:自應用程序啟動以來已載入的應用程序域的峰值。

卸載的 總數:顯示自應用程序啟動以來卸載的應用程序的峰值。如果應用程序域載入和卸載多次,則此計數器將在每次卸載應用程序域時遞增。

程序集總數:自應用程序啟動以來載入的程序集總數

已載入的類總數:自應用程序啟動以來所有程序集中載入的類的累計數量。

鎖定和線程性能計數器

(鎖和線程)類別包括的計數器提供應用程序所使用的託管鎖和託管線程的相關信息

當前邏輯線程數目:應用程序中當前託管的線程數。此計數器包括將正在運行和已停止的線程

當前物理線程數目:創建和擁有的,用作託管線程的基礎線程,的本機操作系統線程數。此計數器的值不包括在其內部操作中使用的線程;它是操作系統進程中線程的子集。

當前已識別的線程數目:當前已由識別的線程數。這些線程與對應的託管線程對象相關聯。不創建這些線程,但它們在至少會運行一次。具有相同線程 ID 的線程不會進行兩次計數

已識別的線程總數:自應用程序啟動以來已由識別的線程總數

競爭率/秒:運行時中線程嘗試獲取託管鎖的失敗率。

當前隊列長度:當前正在等待獲取應用程序託管鎖的線程總數

隊列長度/秒:每秒內等待獲取應用程序鎖的線程數目

隊列長度峰值:自應用程序啟動以來等待獲取託管鎖的線程總數峰值。

已識別線程的速率/秒:每秒內由識別的線程數

爭用總數:運行中線程嘗試獲取託管鎖失敗的總次數

內存性能計數器

(內存)類別包括的計數器提供的相關信息

所有堆中的位元組數:第 代堆、第 代堆和大型對象堆的總和,即垃圾回收堆上分配的當前內存(以位元組為單位)

句柄數:正在使用的垃圾回收句柄的數量。垃圾回收句柄:和託管環境外部的資源的句柄

第代回收次數:自應用程序啟動以來第代對象(即最年輕、最近分配的對象)進行垃圾回收的次數

第 代回收次數:自應用程序啟動以來第 代對象進行垃圾回收的次數

第 代回收次數:自應用程序啟動以來第 代對象進行垃圾回收的次數

已引發 數:因顯式調用 而執行的垃圾回收次數峰值

固定對象數目:在上一次垃圾回收中遇到的固定對象(垃圾回收器不能移入內存的對象)的數目

正在使用的同步塊數目:正在使用的同步塊的數量。 同步塊是用於存儲同步信息而為每個對象分配的數據結構,但它不限於只存儲同步信息,也可以存儲 互操作元數據

已提交的位元組總數:當前已提交的虛擬內存總量(以位元組為單位)

已保留的位元組總數:當前保留的虛擬內存量(以位元組為單位)

所佔時間百分比:執行上次垃圾回收與執行垃圾回收所用時間的百分比。此計數器通常指示代表應用程序收集和壓縮內存所執行的作業

分配的位元組數/秒:堆上每秒分配的位元組數。注意,此計數器在每次垃圾回收結束時(而非每次分配時)更新

最終存活對象:在終結()任務後,仍然存在垃圾回收對象數。 如果這些對象具有對其他對象的引用,則那些對象也會存在,但是不計入此計數器內

第 代堆大小:第 代中可以分配的最大位元組數;但它不能確定第 代中已分配的位元組數

第 代提升的位元組數/秒:每秒從第 代提升到第 代的位元組數

第 代堆大小:第 代中的當前位元組數(切記,此代中的對象不是直接分配的;這些對象是從以前的第 代垃圾回收提升的)

第 代提升的位元組數/秒:每秒從第 代提升到第 代的位元組數

第 代堆大小:第 代中的當前位元組數,不包括大對象,切記:此代中的對象(不包括大對象)不是直接分配的

大型對象堆大小:大型對象堆的當前大小。垃圾回收器將大於 位元組左右的對象視作大對象並且直接在大對象堆中分配;它們不按照級別來提升

進程 ID:顯示被監視的 進程實例的進程 ID。

從第 代提升的終止內存:由於等待終結而從第 代提升到第 代的內存位元組數

從第 代提升的內存:垃圾回收後仍存在並從第 代提升到第 代的內存位元組數

從第 代提升的內存:顯示垃圾回收後仍存在並從第 代提升到第 代的內存位元組數

聯網性能計數器

(網路)類別包括的計數器提供應用程序通過網路發送和接收的數據的相關信息

已接收的位元組數:自進程啟動以來, 中的所有 對象接收到的位元組的總數。此數據包括未定義的任何協議信息的數據

已發送的位元組數:自進程啟動以來, 中的所有 對象已發送的位元組的累積總數。此數據包括未定義的任何協議信息的TCP/IP數據

已建立的連接:自進程啟動以來, 中已經連接的 對象的累積總數

已接收的數據報:自進程啟動以來, 中的所有 對象接收到的數據報包的總數

已發送的數據報:自進程啟動以來, 中的所有 對象已發送的數據報包的總數

平均生存期:自進程啟動以來, 中在上一個間隔中結束的所有對象的平均時間

平均排隊時間:自進程啟動以來, 中在上一個間隔中結束的所有 對象的平均排隊時間

創建的 /秒: 中每秒創建的 對象的數目

已排隊的 /秒: 中每秒添加到隊列的 對象的數量

已中止的 /秒: 中應用程序每秒調用 方法的 對象的數量。

失敗的 /秒: 中每秒從伺服器接收失敗狀態碼的 對象的數量。

其他的網路性能計數器,如:

事件計數器:用於測量某些事件的發生次數

數據計數器:用於測量已發送或已接收的數據量

持續時間計數器:測量不同進程花費的時間。測量對象每個間隔(通常以秒計)退出不同狀態後的次數

每間隔計數器:用於測量每個間隔(通常以秒計)中正在進行特定轉換的對象數

網路性能計數器包含在兩個類別中:

網路: 上引入且在 及更高版本上受支持的原始性能計數器。

網路 4:所有上述套接計數器和 及更高版本上受支持的新的性能計數器

安全性能計數器

(安全性)類別包括的計數器提供公共語言運行時針對應用程序執行的安全檢查的相關信息

鏈接時檢查次數:自應用程序啟動以來鏈接時代碼(link-time code)訪問安全檢查的總次數。 當調用方要求實時 () 編譯時的特定許可權時,執行鏈接時代碼訪問安全檢查

檢查所佔的時間百分比:自上一次取樣以來執行運行時代碼訪問安全檢查所用運行時間的百分比

堆棧審核深度:在上次運行時代碼訪問安全檢查期間的堆棧深度

運行時檢查總數:自應用程序啟動以來執行的運行時代碼訪問安全檢查的總數。當調用方要求特定許可權時,執行運行時代碼訪問安全檢查。 運行時檢查在調用方每次調用時都會執行,並會檢查調用方的當前線程堆棧。 此計數器與「堆棧審閱深度」計數器一起使用時可指示安全檢查出現的性能損失。

其他性能分析工具

JetBrains dotTrace:它可以幫助你優化應用程序性能指標,支持版本到,快速分析程序瓶頸,找出影響效率的代碼。官方網站上有天試用版

ANTS Performance Profiler:性能分析器是一種用於分析框架支持的用任何語言編寫的應用程序的工具。性能分析器能分析所有應用程序,包括網路應用程序、服務和應用程序。性能分析器能在幾分鐘內識別性能瓶頸,運行非常快速,且響應時,對程序的執行具有最低影響。

NET Memory Profiler:一款非常深入分析內存的優化工具,快速發現內存泄漏問題,並且自動進行內存檢測

自帶的性能分析工具:如圖

Analyze

點擊之後,如下圖

Analyze Options

可以看到,由、、內存及性能嚮導四個選項,選擇您想要進行的性能分析,點擊【Start/開始】就可以了

個人微信二維碼
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

人工智慧那麼火,盤點熱門的AI申請方向
札記三十三 儒家與法家

TAG:全球大搜羅 |