使.net可执行在第一时间加载得更快

本文关键字:加载 第一时间 net 可执行 | 更新日期: 2023-09-27 18:05:57

我用c#做了一个简单的Windows Forms可执行程序(简单,我的意思是它有大约20个方法,但它只是一个窗口),目标是。net Framework 2.0。当应用程序加载时,除了构造函数中的默认InitializeComponent();,它不会做任何其他事情。

我第一次打开这个应用程序,在我的Windows 8中加载大约需要7秒。然后,在我下次打开它的时候,它只需要不到一秒钟的时间。

在我尝试的Windows XP中,第一次加载大约需要30秒。在测试应用程序时,我的一些朋友也抱怨第一次加载需要很长时间(大约30秒)。然后需要更快(1或2秒)。

我认为这可能是因为。net框架还没有加载,所以需要一些时间来加载。

您在。net应用程序中遇到过同样的问题吗?
你有任何线索为什么会发生这种情况,我该如何解决这个问题?

编辑-我看到有些人建议NGEN。但是,如果需要在使用该应用程序的每台机器上执行此操作,那么它就不是解决方案。我希望将我的应用程序发布给大量的"普通用户",如果我要求他们做一些额外的事情来使用我的应用程序,那就没有意义了。我们需要。net框架已经够糟糕的了。我的应用程序应该只是一个独立的EXE,没有任何依赖关系(除了框架)。

谢谢。

使.net可执行在第一时间加载得更快

你可以尝试使用NGEN预生成本机图像,当你的应用程序加载时。net将使用NGEN。

您可以在这里找到更多信息- http://msdn.microsoft.com/en-GB/library/6t9t5wcf(v=vs.80).aspx

这些是平台相关的,通常不能转移,所以您需要在部署的每台机器上都这样做。

这很可能是由即时编译CIL引起的。您可以使用NGen为您正在运行的环境编译代码。然而,如果你沿着这条路走下去,你很可能会失去。net的平台不可知性。

MSDN上的这篇博文详细解释了NGen的性能优势,我建议大家读一读。

更新以下注释

正如Lloyd在他的回答中指出的那样,如果你给你的用户一个安装程序,NGen可以在安装应用程序的环境中运行。

然而,如果NGen不是一个选项,那么我建议在启动应用程序时附带一个分析器。它可以突出代码中的任何性能瓶颈。如果您有任何单例或昂贵的静态初始化器,它们将被突出显示,并将给您机会重构它们。

有很多很棒的。net分析器(详见这个问题),我个人建议你看看dotTrace——他们还提供一个月的免费试用期,这可能是你的应用程序所需要的。

[…瞄准。net Framework 2.0。当应用程序加载时,除了默认的InitializeComponent(),它不会做任何其他事情;

其实不是这样的。应用程序还加载类型、初始化静态构造函数等。

在大多数情况下,当我遇到性能问题时,我只是使用分析器…可能会发生很多事情,而分析器是获得一些见解的最简单方法。有一些不同的选择;就我个人而言,我是Red-Gate的分析器的粉丝,他们有一个试用版,你可以使用。

值得注意的是,这种发生的方式在。net框架中发生了变化。如果您无法在2.0中获得想要的性能,我建议您尝试另一个框架。当然,Windows XP可能是个小问题……