几行代码提升.NET应用程序启动速度
为什么使用多核JIT技术
.NET Framework最早发布于2002年,当时电脑的硬件性能并不强大,.NET Framework的设计人员可能考虑绝大部分电脑都是单核处理器,并未对多核处理器进行足够的优化。随着计算机硬件性能的逐渐提高,之前基于单核处理器设计的.NET Framework已经无法满足用户期望应用程序能够快速启动的愿望,因此设计人员引入了多核JIT技术(Multicore JIT),使用多核JIT技术能提升.NET Framework应用程序的启动速度。
多核JIT技术原理
要看到多核JIT提速的效果,我们需要运行应用程序两次,第一次运行应用程序时(记录模式),JIT编译器将所有需要编译的函数均记录下来,等到CLR启动完毕,将记录的这些方法通过配置文件保存至磁盘。
当第二次运行程序时,程序会预先从磁盘加载配置文件,获取到需要编译的函数,然后在后台线程进行JIT编译,如果是多核处理器,就会在另外的核心上并行编译,因此可能在主线程运行之前即可完成即时编译,从而提升应用程序的启动速度,减少白屏时间。
如何使用多核JIT技术
多核JIT技术可以提升所有基于.net framework 4.5以上应用程序的启动速度,包括但不限于WPF桌面应用程序、WinForm桌面应用程序以及ASP .NET。
WPF桌面应用程序
WPF应用程序只需要在App.xaml.cs中的构造函数添加以下内容:
public App()
{
CreateProfileOptimization();
}
private static void CreateProfileOptimization()
{
try
{
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "MyApp");
Directory.CreateDirectory(path);
// 设置JIT profile文件存储的目录
ProfileOptimization.SetProfileRoot(path);
// 通过加载指定的profile文件来使能多核JIT
ProfileOptimization.StartProfile("startup.profile");
}
catch (UnauthorizedAccessException)
{
}
catch (IOException)
{
}
}
其中MyApp可以替换成你的应用的名称,生成的加速文件存储在C:\Users\用户名\AppData\Local\MyApp目录下。
WinForm桌面应用程序
WinForm应用程序在Program.cs文件中添加以下内容启动多核JIT:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
CreateProfileOptimization();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static void CreateProfileOptimization()
{
try
{
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "MyApp");
Directory.CreateDirectory(path);
// 设置JIT profile文件存储的目录
ProfileOptimization.SetProfileRoot(path);
// 通过加载指定的profile文件来使能多核JIT
ProfileOptimization.StartProfile("startup.profile");
}
catch (UnauthorizedAccessException)
{
}
catch (IOException)
{
}
}
多核JIT使用的实际效果
测试条件:
测试参数 | 描述 |
---|---|
CPU | 13th Gen Intel® Core™ i5-13600KF 3.50 GHz 14核心20线程 |
内存 | 32GB DDR5 4800MHz |
硬盘 | KINGSTON SNV2S500G固态硬盘 |
操作系统 | Windows 11专业版 23H2 |
.NET | 6.0 |
测试程序我们使用开源的OxyPlot图表控件进行测试,测试的OxyPlot版本为2.1.2,通过对WpfExamples进行改造,来评估程序的启动时间,首先需要将项目设置为控制台启动,通过控制台来打印程序的启动时间:
未使用多核JIT启动耗时
我们需要对源码进行一下改造来计算启动耗时,通过Stopwatch来精确计算程序的启动时间,首先在App.xaml.cs中添加以下代码:
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
public static Stopwatch Stopwatch { get; private set; }
public App()
{
Stopwatch = new Stopwatch();
Stopwatch.Start();
}
}
在App类的构造函数中初始化Stopwatch并开始计时,然后在主窗体MainWindow.cs的Loaded事件处理函数中停止Stopwatch,并将最终耗时打印在控制台上:
/// <summary>
/// Initializes a new instance of the <see cref="MainWindow" /> class.
/// </summary>
public MainWindow()
{
this.Loaded += this.MainWindow_Loaded;
InitializeComponent();
this.DataContext = this;
this.Examples = this.GetExamples(this.GetType().Assembly).OrderBy(e => e.Title).ToArray();
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
App.Stopwatch.Stop();
Console.WriteLine($"启动耗时{App.Stopwatch.ElapsedMilliseconds}毫秒");
}
在MainWindow的构造函数中,我们订阅了Loaded事件,并在MainWindow_Loaded事件中停止了Stopwatch,从而计算出了应用程序启动的时间,通过10次测试,计算启动的平均耗时,每次耗时及平均耗时见下表所示:
序号 | 耗时(mS) |
---|---|
1 | 400 |
2 | 401 |
3 | 401 |
4 | 385 |
5 | 390 |
6 | 393 |
7 | 406 |
8 | 399 |
9 | 403 |
10 | 398 |
平均 | 397.6 |
未使用多核JIT启动耗时截图:
使用多核JIT启动耗时
基于原有代码,将App.xaml.cs进行改造,添加多核JIT的支持:
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
public static Stopwatch Stopwatch { get; private set; }
public App()
{
Stopwatch = new Stopwatch();
Stopwatch.Start();
CreateProfileOptimization();
}
private static void CreateProfileOptimization()
{
try
{
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "WpfExamples");
Directory.CreateDirectory(path);
// 设置JIT profile文件存储的目录
ProfileOptimization.SetProfileRoot(path);
// 通过加载指定的profile文件来使能多核JIT
ProfileOptimization.StartProfile("startup.profile");
}
catch (UnauthorizedAccessException)
{
}
catch (IOException)
{
}
}
}
改造完毕后,编译,运行,注意!!!第一次运行速度不会有提升,第二次运行时速度才会提升,同样运行10次,每次运行耗时及平均耗时如下表所示:
序号 | 耗时(mS) |
---|---|
1 | 344 |
2 | 348 |
3 | 344 |
4 | 346 |
5 | 342 |
6 | 348 |
7 | 347 |
8 | 344 |
9 | 351 |
10 | 349 |
平均 | 346.3 |
使用多核JIT启动耗时截图:
性能对比
未使用多核JIT应用启动平均时间为397.6毫秒,使用多核JIT应用平均启动时间为346.3,启动速度提升了12.9%。由于本次测试使用的电脑配置相对较高,因此差距并不是很大,对于单核性能较弱的电脑,实际测试启动速度提升率会更高,平均提速大约为10%~50%,大家可以自行验证一下。
标签:启动,几行,耗时,JIT,多核,应用程序,Stopwatch,NET From: https://blog.csdn.net/2402_88871930/article/details/143697255