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