翻譯|行業資訊|編輯:龔雪|2023-02-06 10:38:47.297|閱讀 212 次
概述:在本文中,將為大家記錄9個提升WPF應用程序冷啟動性能的策略。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
本文記錄9個提升WPF應用程序冷啟動性能的策略,面列出的3個技術適用于所有WPF應用程序,無論使用什么組件:
以下技術是針對DevExpress WPF界面控件的:
最后一種技術涉及使用Visual Studio的Performance Profiler(幫助確定與性能相關問題的潛在原因)。
PS:有用控件推薦~DevExpress WPF擁有120+個控件和庫,將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。
DevExpress技術交流群7:674691612 歡迎一起進群討論
(原生圖像生成器)是優化 .NET框架應用程序((.NET/. NET Core項目不支持Ngen)應該考慮的第一個工具,.NET框架項目使用Microsoft中間語言(MSIL)代碼生成程序集。在執行應用程序之前,需要將此代碼轉換為機器代碼,從MSIL到機器代碼的轉換在啟動時就開始了——這個過程可能需要大量的時間。
開發人員可以使用Ngen.exe生成已經包含本機代碼的原生映像庫,需要注意的是,Ngen.exe應該在將要使用應用程序的機器上使用。開發人員可以在自己的機器上運行它來測試性能,但為了優化終端用戶的冷啟動,需要在用戶機器上使用Ngen.exe。
在用戶的機器上運行Ngen的最佳方法是將Ngen.exe合并到應用程序安裝程序中。在安裝過程中,開發人員需要執行以下命令行,Ngen.exe將自動處理與項目相關的所有程序集:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe install C:\MyApp.exe
如果開發者將應用程序作為單擊一次或存檔(并且沒有安裝程序)分發,則可以在應用程序啟動期間從代碼中調用Ngen.exe。要在第一次啟動時只運行Ngen.exe,為可執行文件計算一個哈希值,并在后續啟動時檢查這個哈希值:
var savedHash = string.Empty; var assemblyLocation = Assembly.GetEntryAssembly().Location; // Specify a path to the file that stores your executable’s hash. // Create this file or load the saved hash if the file already exists: var hashPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "hash.txt"); if (!File.Exists(hashPath)) { File.Create(hashPath); } else { savedHash = File.ReadAllText(hashPath); } // Obtain the hash for your executable. // Cancel the operation if the application does not have changes: var hash = string.Concat(SHA1.Create().ComputeHash(File.ReadAllBytes(assemblyLocation)) .Select(x => x.ToString("x2"))); if (hash.Equals(savedHash)) return; // Obtain the path to ngen.exe: var dotNetRuntimePath = RuntimeEnvironment.GetRuntimeDirectory(); var ngenPath = Path.Combine(dotNetRuntimePath, "ngen.exe"); // Create a process that runs ngen.exe: var process = new Process { StartInfo = new ProcessStartInfo { FileName = ngenPath, // Pass the path to your executable: Arguments = $"install \"{assemblyLocation}\" /nologo", CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, // Run the process as administrator: UseShellExecute = true, Verb = "runas" } }; // Run the process and save the executable’s hash: try { process.Start(); process.WaitForExit(); File.WriteAllText(hashPath, hash); } catch { // Failed to start. // For example, a user cancelled the UAC prompt. }
Windows 8(以及更新版本的Windows操作系統)包含一個本機映像任務,當計算機空閑時,它會自動為經常使用的.NET Framework 4.5+應用程序生成本機映像。盡管如此,開發者仍然需要手動運行Ngen.exe,因為本機圖像任務僅適用于位于GAC或Windows Store應用程序包中的程序集。
下面的圖片說明了可以從Ngen.exe啟動的好處:
或者,開發者可以優化Microsoft中間語言(MSIL)到機器代碼的轉換,方法是在應用程序啟動時異步轉換最常用的方法,為此可以使用MultiCore JIT(可用于.NET 和 .NET Framework 4.5+應用程序)。MultiCore JIT記錄應用程序使用的方法,并將它們保存到磁盤,當應用程序第二次執行時,保存的方法將在單獨的進程中編譯為本機代碼。
開發者只需要在應用構造函數中使用以下兩行代碼來啟用MultiCore JIT:
public App() { // Defines where to store JIT profiles ProfileOptimization.SetProfileRoot(@"C:\MyAppFolder"); // Enables Multicore JIT with the specified profile ProfileOptimization.StartProfile("Startup.Profile"); }
MultiCore JIT在啟動優化方面不如Ngen.exe有效,但另一方面它同時支持.NET Framework和.NET/. NET Core項目。開發者可以將MultiCore JIT與ReadyToRun選項結合使用(稍后將介紹),并從這兩種優化策略中受益。
ReadyToRun (R2R)是一種提前編譯(AOT)的形式,用R2R發布的應用程序同時包含MSIL和本機代碼段,這在一定程度上消除了即時編譯的需要。
R2R選項僅在.NET/. NET Core項目中可用,要啟用R2R,請修改“. csproj” / “. vbproj”文件和新增PublishReadyToRun標簽:
<PropertyGroup> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup>
要執行此策略,請發布您的項目:
1. 右鍵單擊項目并選擇Publish:
2. 在隨后的對話框中,選擇發布的應用程序將駐留的目標文件夾。
3. 打開發布設置,選擇目標運行時,單擊Publish按鈕:
4. 打開目標文件夾并運行“.exe”文件。
如前所述,R2R可以在.NET/. NET Core應用程序中與MultiCore JIT一起使用,下圖說明了可以從R2R和MultiCore JIT中獲得的啟動好處。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網