翻譯|行業(yè)資訊|編輯:龔雪|2023-02-06 10:38:47.297|閱讀 212 次
概述:在本文中,將為大家記錄9個提升WPF應(yīng)用程序冷啟動性能的策略。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
本文記錄9個提升WPF應(yīng)用程序冷啟動性能的策略,面列出的3個技術(shù)適用于所有WPF應(yīng)用程序,無論使用什么組件:
以下技術(shù)是針對DevExpress WPF界面控件的:
最后一種技術(shù)涉及使用Visual Studio的Performance Profiler(幫助確定與性能相關(guān)問題的潛在原因)。
PS:有用控件推薦~DevExpress WPF擁有120+個控件和庫,將幫助您交付滿足甚至超出企業(yè)需求的高性能業(yè)務(wù)應(yīng)用程序。通過DevExpress WPF能創(chuàng)建有著強大互動功能的XAML基礎(chǔ)應(yīng)用程序,這些應(yīng)用程序?qū)W⒂诋?dāng)代客戶的需求和構(gòu)建未來新一代支持觸摸的解決方案。
DevExpress技術(shù)交流群7:674691612 歡迎一起進群討論
(原生圖像生成器)是優(yōu)化 .NET框架應(yīng)用程序((.NET/. NET Core項目不支持Ngen)應(yīng)該考慮的第一個工具,.NET框架項目使用Microsoft中間語言(MSIL)代碼生成程序集。在執(zhí)行應(yīng)用程序之前,需要將此代碼轉(zhuǎn)換為機器代碼,從MSIL到機器代碼的轉(zhuǎn)換在啟動時就開始了——這個過程可能需要大量的時間。
開發(fā)人員可以使用Ngen.exe生成已經(jīng)包含本機代碼的原生映像庫,需要注意的是,Ngen.exe應(yīng)該在將要使用應(yīng)用程序的機器上使用。開發(fā)人員可以在自己的機器上運行它來測試性能,但為了優(yōu)化終端用戶的冷啟動,需要在用戶機器上使用Ngen.exe。
在用戶的機器上運行Ngen的最佳方法是將Ngen.exe合并到應(yīng)用程序安裝程序中。在安裝過程中,開發(fā)人員需要執(zhí)行以下命令行,Ngen.exe將自動處理與項目相關(guān)的所有程序集:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe install C:\MyApp.exe
如果開發(fā)者將應(yīng)用程序作為單擊一次或存檔(并且沒有安裝程序)分發(fā),則可以在應(yīng)用程序啟動期間從代碼中調(diào)用Ngen.exe。要在第一次啟動時只運行Ngen.exe,為可執(zhí)行文件計算一個哈希值,并在后續(xù)啟動時檢查這個哈希值:
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操作系統(tǒng))包含一個本機映像任務(wù),當(dāng)計算機空閑時,它會自動為經(jīng)常使用的.NET Framework 4.5+應(yīng)用程序生成本機映像。盡管如此,開發(fā)者仍然需要手動運行Ngen.exe,因為本機圖像任務(wù)僅適用于位于GAC或Windows Store應(yīng)用程序包中的程序集。
下面的圖片說明了可以從Ngen.exe啟動的好處:
或者,開發(fā)者可以優(yōu)化Microsoft中間語言(MSIL)到機器代碼的轉(zhuǎn)換,方法是在應(yīng)用程序啟動時異步轉(zhuǎn)換最常用的方法,為此可以使用MultiCore JIT(可用于.NET 和 .NET Framework 4.5+應(yīng)用程序)。MultiCore JIT記錄應(yīng)用程序使用的方法,并將它們保存到磁盤,當(dāng)應(yīng)用程序第二次執(zhí)行時,保存的方法將在單獨的進程中編譯為本機代碼。
開發(fā)者只需要在應(yīng)用構(gòu)造函數(shù)中使用以下兩行代碼來啟用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在啟動優(yōu)化方面不如Ngen.exe有效,但另一方面它同時支持.NET Framework和.NET/. NET Core項目。開發(fā)者可以將MultiCore JIT與ReadyToRun選項結(jié)合使用(稍后將介紹),并從這兩種優(yōu)化策略中受益。
ReadyToRun (R2R)是一種提前編譯(AOT)的形式,用R2R發(fā)布的應(yīng)用程序同時包含MSIL和本機代碼段,這在一定程度上消除了即時編譯的需要。
R2R選項僅在.NET/. NET Core項目中可用,要啟用R2R,請修改“. csproj” / “. vbproj”文件和新增PublishReadyToRun標簽:
<PropertyGroup> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup>
要執(zhí)行此策略,請發(fā)布您的項目:
1. 右鍵單擊項目并選擇Publish:
2. 在隨后的對話框中,選擇發(fā)布的應(yīng)用程序?qū)Ⅰv留的目標文件夾。
3. 打開發(fā)布設(shè)置,選擇目標運行時,單擊Publish按鈕:
4. 打開目標文件夾并運行“.exe”文件。
如前所述,R2R可以在.NET/. NET Core應(yīng)用程序中與MultiCore JIT一起使用,下圖說明了可以從R2R和MultiCore JIT中獲得的啟動好處。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)