5

我用 C# 制作了一个简单的 Windows 窗体可执行文件(简单来说,我的意思是它有大约 20 个方法,但它只是一个窗口),目标是 .NET Framework 2.0。InitializeComponent();当应用程序加载时,除了构造函数中的默认值外,它不会做任何事情。

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

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

我认为这可能是因为 .NET Framework 尚未加载,因此在他们的机器中加载需要一些时间。

您是否曾在使用 .NET 应用程序时遇到过同样的问题?
你有什么线索为什么会发生这种情况,我该如何解决这个问题?

编辑 - 我看到有些人建议使用 NGEN。但是,如果这需要在每台将使用该应用程序的机器上完成,它就不能解决这个问题。我想将我的应用程序发布给大量“普通用户”,如果我要求他们做一些额外的事情来使用我的应用程序,那是没有意义的。我们需要 .NET Framework 已经够糟糕了。我的应用程序应该只是一个没有任何依赖项的独立 EXE(框架除外)。

谢谢你。

4

3 回答 3

6

You can try pre-generating the native image using NGEN which .NET will use when your application loads.

You can find more information here - http://msdn.microsoft.com/en-GB/library/6t9t5wcf(v=vs.80).aspx

These are platform dependant and not transferable usually so you'll need to do this on each machine you deploy on.

于 2013-03-26T23:38:12.067 回答
5

This is most likely caused by Just-In-Time compilation of the CIL. You can compile your code for the environment that you are running on using NGen. However, you will most likely lose the platform agnostic-ness of .Net if you go down this route.

This blog entry on MSDN explains the performance benefits of NGen in some detail, I suggest giving it a read.

Update following comments

As Lloyd points out in his answer, if you give your users an installer NGen can be run at this point for the environment that the application is being installed on.

However, if NGen isn't an option, then I'd recommend starting your application with a profiler attached. It can highlight any performance bottlenecks in your code. If you have any singletons or expensive static initializers these will be highlighted as such and will give you the opportunity to refactor them.

There are many great .Net profilers out there (see this SO question for details), personally I'd recommend having a look at dotTrace - they also offer a free trial period for a month which may be all that's required for your application.

于 2013-03-26T23:37:57.217 回答
0

[...] 面向 .NET Framework 2.0。当应用程序加载时,它除了默认的 InitializeComponent() 之外什么都不做;在构造函数中。

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

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

值得注意的是,发生这种情况的方式在 .NET Framework 中发生了变化。如果你不能在 2.0 中获得你想要的性能,我会简单地尝试另一个框架。当然,Windows XP 在那里可能是一个小问题......

于 2013-03-27T22:09:20.970 回答