我在C#中创建了一个简单的Windows Forms可执行文件(简单来说,我的意思是它有大约20个方法,但它只是一个窗口),目标是.NET Framework 2.0。加载应用程序时,除了构造函数中的默认InitializeComponent();
之外,它不会执行任何操作。
第一次打开时,应用程序大约需要7秒钟才能在我的Windows 8中加载。然后在我打开它的下一次不到一秒钟。
在我试过的Windows XP中,第一次加载 30秒需要 30秒。在测试应用程序时,我的一些朋友也抱怨说第一次加载需要花费很多时间(大约30秒)。然后它需要更快(1或2秒)。
我认为这可能是因为.NET Framework尚未加载,因此加载其计算机需要一些时间。
您是否遇到过.NET应用程序的相同问题?
您是否知道为什么会发生这种情况?我该如何解决这个问题?
编辑 - 我看到有些人建议使用NGEN。但是,如果需要在每台将使用该应用程序的计算机上完成此操作,则无法解决此问题。我想将我的应用程序发布给大众“普通用户”,如果我要求他们做一些额外的东西来使用我的应用程序,这是没有意义的。我们需要.NET Framework已经足够糟糕了。我的应用程序应该只是一个没有任何依赖关系的独立EXE(框架除外)。
谢谢。
答案 0 :(得分:6)
您可以尝试使用NGEN预生成本机映像,.NET将在您的应用程序加载时使用。
您可以在此处找到更多信息 - http://msdn.microsoft.com/en-GB/library/6t9t5wcf(v=vs.80).aspx
这些是平台相关的,通常不可转让,因此您需要在部署的每台计算机上执行此操作。
答案 1 :(得分:5)
这很可能是由CIL的即时编译引起的。您可以使用NGen编译正在运行的环境的代码。但是,如果沿着这条路走下去,你很可能会失去.Net的平台无关性。
MSDN上的This blog entry详细解释了NGen的性能优势,我建议您阅读。
更新以下评论
正如Lloyd在他的回答中指出的那样,如果你给用户一个安装程序,那么NGen就可以在这个环境中运行安装应用程序的环境。
但是,如果NGen不是一个选项,那么我建议您使用附带的分析器启动您的应用程序。它可以突出显示代码中的任何性能瓶颈。如果您有任何单件或昂贵的静态初始化器,这些将被突出显示,并为您提供重构它们的机会。
那里有很多很棒的.Net个人资料(see this SO question for details),我个人建议看看dotTrace - 他们还提供了一个月的免费试用期,这可能就是所有的你的申请需要。
答案 2 :(得分:0)
[...]针对.NET Framework 2.0。当应用程序加载时,它除了默认的InitializeComponent()之外没有做任何其他操作;在构造函数中。
其实这不是真的。应用程序还会加载类型,初始化静态构造函数等。
在大多数情况下,当我遇到性能问题时,我只是使用了一个分析器...可能会有很多事情发生,而分析器是获取一些见解的最简单方法。有一些不同的选择;就个人而言,我是Red-Gate的分析师的粉丝,他们有一个你可以使用的试用版。
值得注意的是,.NET Framework中发生这种情况的方式发生了变化。如果你无法在2.0中获得所需的性能,我只想尝试另一个框架。当然,Windows XP可能是一个小问题......