減少記憶體和硬碟空間的使用,有助於提升應用程式效能。
本指南將示範如何以兩種主要方式改善 Windows 應用程式的效能:
將記憶體使用量降至最低
有多種方式可將 Windows 應用程式使用的記憶體數量降到最低,您可以:
- 減少前景記憶體使用量
- 最大程度地減少背景工作
- 在背景時釋放資源
- 確保您的應用程式不會流失記憶體
為了適當地將記憶體使用量降到最低,請務必瞭解:
- 如何使用工作集、 動態記憶體和虛擬配置來使用和配置記憶體,
- 如何 擷取系統追蹤,以及
- 如何 分析系統追蹤。
一旦系統追蹤可供分析,我們建議參閱套用追蹤分析以降低記憶體使用量的指引。
工作集、動態記憶體和虛擬配置
應用程式的工作集是指它虛擬記憶體空間中目前存在於記憶體中的頁面集合,這是衡量應用程式記憶體使用量的指標。
應用程式使用的記憶體數量會影響其執行階段效能,以及整個系統的回應性。 減少記憶體使用量有助於提升應用程式的效能,因為這可以降低 CPU 存取更多記憶體所需的成本。 使用較少的記憶體也有助於系統的反應速度,並改善應用程式使用者的整體體驗,因為應用程式不會導致其他記憶體內容被替換。
當系統嘗試保留最近存取的記憶體內部內容時,可能會發生記憶體位移,如果需要的話,會修剪和清除較早使用的內容。 當使用者切換回殼層或其他應用程式,且必要的資料不在記憶體中時,就必須從磁碟讀取資料。 使用者可能會因為這個程序而感到速度變慢。
應用程式所使用的記憶體有兩個主要部分:1) 動態記憶體,以及 2) 檔案支援的記憶體。 檔案支援的記憶體使用量來自應用程式所使用的二進位檔和資料檔,例如資料庫。 這通常不是應用程式記憶體使用量的重要區塊,而且通常是常數。 (例外狀況是資料處理應用程式、程式碼編譯等) 記憶體使用量的較重要來源,以及流失資訊清單是動態記憶體的位置。
動態記憶體會對應至使用記憶體配置常式的應用程式所配置的虛擬記憶體。 不同於在系統重新啟動期間保存的檔案支援記憶體,動態記憶體只會存在於應用程式的存留期內。 動態記憶體是記憶體使用量的常見重要來源,記憶體流失資訊清單的位置。
虛擬配置常式 (VirtualAlloc
) 會處理來自 Windows 應用程式的記憶體配置要求,與用於記憶體配置的應用程式層常式無關。 雖然應用程式所配置的所有記憶體可能隨時都位於記憶體中,但分析這類配置可提供一致的方式來瞭解應用程式的記憶體使用量。
若要瞭解應用程式的記憶體使用量,並尋找改善的地方,建議您擷取 VirtualAllocation 追蹤,如下所示。
擷取系統追蹤以分析記憶體使用量
在一段時間內錄製裝置活動稱為系統追蹤。系統追蹤會產生可用來產生報表的追蹤檔案,並協助您識別如何改善應用程式的效能。
追蹤的長度可能會有所不同:
- 短期執行追蹤可用來擷取應用程式的啟動。 這可以包括您的應用程式轉換為非使用中狀態,當應用程式處理序仍在持續時,應用程式視窗最小化或應用程式視窗關閉。
- 長時間執行的追蹤,通常持續時間為數分鐘,有助於診斷記憶體流失。 如果記憶體使用量隨著時間持續上升,這通常表示發生流失。
有數個工具可用於監視記憶體使用量,包括:
基於本文的目的,我們將著重於使用 Windows 效能分析器。 若要深入瞭解如何選擇工具來分析應用程式的效能,請參閱在Visual Studio 效能分析工具、Windows 效能工具組和 PerfView 中選擇。
若要擷取追蹤:
以系統管理員模式開啟命令列 (PowerShell 或命令提示字元)。 (如果未以系統管理員模式執行,您可能會收到錯誤碼:0xc5585011「無法啟用原則來分析系統效能」。)
輸入命令:
wpr -start VirtualAllocation -filemode
執行您正在調查的案例。 (例如,啟動您的應用程式。)
輸入命令:
wpr -stop Trace.etl
分析系統追蹤
為了找出您的應用程式中配置了那些可能減少記憶體的功能,您現在需要分析已擷取的系統追蹤。 若要分析追蹤:
輸入命令
wpa.exe Trace.etl
,使用 Windows 效能分析器 開啟追蹤在 Graph 總管視窗中,展開 [記憶體 ] 區段,以滑鼠右鍵按一下 [總提交] 圖形,然後選取 [將圖表新增至新的分析檢視]。
按一下 [設定] 齒輪,開啟檢視編輯器,選擇以下資料欄排列方式:處理序、提交類型、提交堆疊及大小。
按一下 [大小] 資料欄標頭,以遞減順序排序結果。 提交堆疊會顯示導致配置記憶體的程式碼路徑。 這些結果可能有助於瞭解配置的原因。 依大小排序可讓您專注於較大的配置,並調查是否有機會進行最佳化。
使用滑鼠右鍵按一下您有興趣分析的處理序,並選擇 [篩選到選取項目],對處理序進行篩選。
若要放大檢視區中感興趣的區域,請選取範圍,以滑鼠右鍵按一下圖形,然後選取 [縮放]。
瀏覽提交堆疊,以瞭解哪些函式已配置記憶體。 提交堆疊需要載入符號。 若要載入符號,請從頂端導覽功能表列選取 [追蹤>載入符號]。
套用追蹤分析以減少記憶體使用量
在分析配置的記憶體時,您會發現可協助您決定記憶體使用量最小化的線索。
針對應用您的追蹤分析以更新程式碼以減少記憶體使用量,有幾個方面需要考慮,包括:
在前景時減少記憶體使用量:分析記憶體追蹤可協助您識別前景中任何不必要的記憶體使用量,並更新您的程式碼以減少或移除該使用量。
在背景中將工作降到最低:系統有原則可讓處理序工作集的分頁過期。 在背景中使用較少的記憶體可以讓系統更有效率,因為保留較少應用程式佔用的記憶體。 深入瞭解如何透過最小化背景工作來改善耗電量和電池使用時間,這也會在背景中轉譯成使用較少的記憶體使用量。
在背景釋放資源:在執行階段,應用程式可能會建立一些記憶體快取,以及建立圖形配置來支援其 UI。 當應用程式最小化或看不到時,這些配置可能會釋出。 應用程式可以註冊低記憶體通知以採取這類動作,但較佳的策略可能是當應用程式為非使用中狀態時,在一段時間未使用後釋放記憶體。 這種不使用期間可能會因應用程式而異,因此非使用中用途的可能指標範圍從幾分鐘到半小時以上。 應該注意在節省記憶體的同時,也要保持系統的回應性。 如果重建快取的成本很高,應用程式可以選擇保留應用程式存留期。
請確定您的應用程式不會流失記憶體:若要檢查記憶體流失,請先建立穩定狀態基準,其中應用程式記憶體使用量會穩定,或不會成長超過特定值。 您可以持續使用應用程式,或在背景中將其保持閒置,來建立此穩定狀態。 使用您擷取的追蹤來識別可能的記憶體流失,您可以在程式碼中找出該記憶體配置的位置,以及如何在它提供服務之後釋出記憶體。 如果記憶體在應用程式執行時繼續成長,這可能是記憶體流失的跡象。 放大至與您追蹤中的增長相對應的區域,並仔細分析提交堆疊。
有效率地使用磁碟空間
磁碟使用量指的是應用程式在非執行狀態 (不執行程式碼)時所佔的大小。 如果應用程式佔用大量磁碟空間,可能是最佳化的機會。
有數種方式可減少應用程式的磁碟使用量,以改善效能:
當磁碟已滿時,檔案系統就無法再以連續的方式儲存新內容。 完整磁碟會變得分散,將新內容儲存在非連續磁區上。 這意味著當從磁碟讀取該內容時,會有較長的延遲時間。 當內容是連續的並且可以循序存取或使用較大的 IO 時,IO 系統將提供更佳的磁碟輸送量。
全滿的磁碟可能導致 SSD 系統的寫入延遲增加。 當空白儲存區域較少時,以吸收寫入的方式進行寫入,可能會導致讀取-修改-寫入作業,從而降低效能。
全滿的磁碟可能會阻礙應用程式更新。 當 OS 具備很強的恢復能力,即使可用磁碟空間較少也能保持系統最新且安全,但為您的應用程式更新預留足夠的磁碟空間,將會帶來更快速、更順暢的更新體驗。
在執行階段需要大量存取大型磁碟空間,也將轉化為記憶體使用量。 這會影響應用程式和系統的回應性。 此外,如果在執行階段需要少量的磁碟使用量,則應用程式可能會磁碟空間使用效率不佳。
使用下列幾個方法來減少磁碟空間,或讓使用效率更佳:
將「隨用隨付」原則運用到您的磁碟空間 (僅下載您需要的部分):應用程式可能包含各種功能,但並非所有功能都適用於所有使用者。 這可能是磁碟使用量大的原因之一。 藉由運用「隨用隨付」原則,您可以要求使用者只選取下載所需的功能,在下載您的應用程式時轉為較小的磁碟使用量。 只有在使用者需要更豐富的功能時,才能選擇下載其他內容。 除了功能之外,您還可以將相同的「隨用隨付」原則運用至語言支援。 應用程式可以預設包含一組受歡迎的語言選擇子集,額外的語言可以選擇性地包含,或是相依於使用者系統上設定的地區。
提高快取大小效率:在某些情況下,應用程式可以使用磁碟上的快取來提升使用者體驗。 應用程式可以設定快取管理策略,根據磁碟容量設定快取大小的上限,並在磁碟空間不足時調整快取大小。
有效運用資產:應用程式通常會包含影像資產,可能會包含各種影像大小,以支援多種解析度。 對於部分解析度進行影像大小、尺寸、格式和壓縮的最佳化,並利用縮放來支援其餘解析度,可以顯著減少磁碟佔用空間。
調查二進位最佳化機會:諸如 SizeBench 工具可讓應用程式作者調查二進位檔案大小的因素,找出減少磁碟空間使用量的機會。