Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测量c#应用程序的启动性能_C#_Performance - Fatal编程技术网

测量c#应用程序的启动性能

测量c#应用程序的启动性能,c#,performance,C#,Performance,我注意到有时候.NET4.0C应用程序启动需要很长时间,没有任何明显的原因。我可以确定实际发生了什么,加载了哪些模块吗?我正在使用一些外部组件。将他们加入GAC能提高绩效吗 .NET4比.NET2慢吗?我认为将程序集放在GAC中不会启动性能。 如果可能,对加载时编写的每一条指令进行日志记录或初始化事件,这可能有助于您确定哪个语句实际上需要时间,并且通过此操作您可以确定加载时需要时间的库。我认为将程序集放入GAC不会启动性能。 如果可能,对加载时编写的每一条指令进行日志记录或初始化事件,这可能有助

我注意到有时候.NET4.0C应用程序启动需要很长时间,没有任何明显的原因。我可以确定实际发生了什么,加载了哪些模块吗?我正在使用一些外部组件。将他们加入GAC能提高绩效吗


.NET4比.NET2慢吗?

我认为将程序集放在GAC中不会启动性能。
如果可能,对加载时编写的每一条指令进行日志记录或初始化事件,这可能有助于您确定哪个语句实际上需要时间,并且通过此操作您可以确定加载时需要时间的库。

我认为将程序集放入GAC不会启动性能。
如果可能,对加载时编写的每一条指令进行日志记录或初始化事件,这可能有助于您确定哪条语句实际花费了时间,并且通过此记录,您可以确定加载时花费了时间的库。

启动时间最有可能是由于运行时JIT将程序集IL编译为机器代码,以便执行。它也可能受到调试器的影响——正如另一位回答者所建议的那样

除此之外,我将讨论在用户机器上“野外”运行的应用程序,没有调试器等

我认为公平地说,.NET4中的JIT编译器比.NET2中的要好——所以没有;它不慢

通过在应用程序的程序集上运行,您可以显著缩短启动时间—这会将EXE和DLL预编译为本机映像。然而,这样做会失去一些灵活性,一般来说,这没有多大意义

你应该看到一些用C++编写的MFC应用程序的启动时间——所有的本地代码,但是取决于它们是如何连接的,它们可以占用同样长的时间。


当然,这也取决于应用程序在启动时实际执行的操作

启动时间很可能是由于运行时JIT将程序集IL编译为机器代码以供执行。它也可能受到调试器的影响——正如另一位回答者所建议的那样

除此之外,我将讨论在用户机器上“野外”运行的应用程序,没有调试器等

我认为公平地说,.NET4中的JIT编译器比.NET2中的要好——所以没有;它不慢

通过在应用程序的程序集上运行,您可以显著缩短启动时间—这会将EXE和DLL预编译为本机映像。然而,这样做会失去一些灵活性,一般来说,这没有多大意义

你应该看到一些用C++编写的MFC应用程序的启动时间——所有的本地代码,但是取决于它们是如何连接的,它们可以占用同样长的时间。


当然,这也取决于应用程序在启动时实际执行的操作

.NET程序有两种不同的启动行为。它们被称为冷启动和热启动。冷启动是一种缓慢的启动方式,当以前没有启动.NET程序时,您会得到它。或者当您启动的程序很大且以前从未运行过时。操作系统必须在磁盘上找到程序集文件,它们在文件系统缓存(RAM)中不可用。这需要一段时间,硬盘速度很慢,而且有很多文件需要查找。一个小型的无所事事Winforms应用程序必须加载51个DLL才能开始。一个无所事事的WPF应用程序的重量为77 DLL

不久前加载程序集文件时,您就有了一个良好的开端。汇编文件数据现在来自RAM,而不是慢速磁盘,即zippedy doodah。现在唯一的启动开销是抖动

对于冷启动,您几乎无能为力,组件必须以这样或那样的方式从磁盘中取出。快速的磁盘会带来很大的不同,SSD尤其有效。使用ngen.exe预jit程序集实际上会使问题变得更糟,它会创建另一个需要查找和加载的文件。这就是Microsoft建议不要预JIT小程序集的原因。鉴于.NET 4程序的这个问题也被高度指出,您没有太多绑定到版本4 CLR和框架程序集的程序。无论如何,现在还没有,这会随着时间的推移自行解决


还有另一种方法,这个问题会自动消失。Windows SuperFetch功能将开始注意到您经常加载CLR和jitted框架程序集,并开始自动将它们预加载到RAM中。与Microsoft Office和Adobe Reader“优化器”使用的技巧相同。它们也是具有许多DLL依赖关系的程序。如果是非托管的,则问题并不特定于.NET。这些优化器很粗糙,它们在您登录时预加载DLL。这是解决问题的“我很重要,其他一切都搞定”方法,请确保禁用它们,以免它们挤出SuperFetch可以使用的RAM空间。

.NET程序有两种不同的启动行为。它们被称为冷启动和热启动。冷启动是一种缓慢的启动方式,当以前没有启动.NET程序时,您会得到它。或者当您启动的程序很大且以前从未运行过时。操作系统必须在磁盘上找到程序集文件,它们在文件系统缓存(RAM)中不可用。这需要一段时间,硬盘速度很慢,而且有很多文件需要查找。一个小型的无所事事Winforms应用程序必须加载51个DLL才能开始。一个无所事事的WPF应用程序的重量为77 DLL

不久前加载程序集文件时,您就有了一个良好的开端。汇编文件数据现在来自RAM,而不是慢速磁盘,即zippedy doodah。现在唯一的启动开销是抖动

对于冷启动,您几乎无能为力,组件必须以这样或那样的方式从磁盘中取出。快速的磁盘会带来很大的不同,SSD尤其有效。使用ngen.exe预jit程序集实际上会使问题变得更糟,它会创建另一个文件,该文件将被删除