【问题标题】:How can I speed up the performance of the first execution of my .NET app?如何加快 .NET 应用程序首次执行的性能?
【发布时间】:2009-06-26 17:41:14
【问题描述】:

我们的 C# 客户端应用程序在首次运行时总是需要更长的时间来加载。我还没有测试是否是 any .NET 应用程序的第一次运行速度较慢,或者 each .NET 应用程序的第一次运行速度是否慢较慢,但无论如何它仍然是一个问题。我们如何才能消除这种一次性启动打击?

我最初的想法是某种服务可以“热身”图书馆。我们需要为每个应用程序执行此操作,还是只为任何 .NET 应用程序执行此操作?服务运行的用户会有所作为吗?也许不是 Windows 服务,而是在 Windows 登录上运行的应用程序可以做这些脏活?同样,它是一个 .NET 服务这一事实是否就足够了,还是我们必须运行我们的每个程序来消除惩罚?我们可以传入一个命令行参数来告诉程序立即退出,但这是否足够,或者我们是否需要 .NET 来加载我们将在应用程序正常执行期间使用的每个程序集?


回复:一些答案,我们正在部署发布模式的 DLL,减速仅在第一次启动时。我们正在尽可能地延迟类的初始化。

【问题讨论】:

    标签: .net performance client-server desktop-application


    【解决方案1】:

    它是让您在第一次运行 .net 应用程序时等待的 JIT(即时编译)。这会在运行代码之前将您的 IL 编译为机器代码。仅第一次发生这种情况的原因是机器代码版本随后存储在磁盘上并被重复使用。

    您可以使用NGEN.EXE 预jit您的应用程序...

    这需要在您运行软件的计算机上完成,因为 JIT 将针对运行它的 CPU 进行编译和优化。您可以在程序安装过程中执行此操作...

    【讨论】:

    • 在下面引用的页面上,“如果您使用 NGEN,您需要注意在内存中加载本机图像时可能会发生变基...如果您构建多个 DLL 作为在您的应用程序中,当应用程序加载时,rebase 肯定会发生,因为分配给每个 DLL 的默认基地址始终相同(0x400000)。”我们将许多 DLL 作为我们的主要应用程序的一部分 (>20)。我们还会看到好处吗?
    • 读得好,谢谢...我从来不知道这个问题...但是正如文章中所述(在“避免变基”下),可以不同地设置基地址。我相信您在 VS.NET 中执行此操作,转到项目属性-> 构建-> 向下滚动并单击高级按钮。如果我没记错的话,你会发现那里的设置......(我不知道用 20 多个程序集来做这件事有多实用......也许你可以自动化?)
    【解决方案2】:

    其他答案谈到了 JIT 时间,但根据我的经验,另一个非常重要的因素是启动后第一次加载 .NET 框架本身所花费的时间。

    尝试编写一个绝对微不足道的程序(尽管最好至少涉及您的实际代码使用的程序集)。编译它并重新启动。运行普通程序,然后(当它完成后)运行你的真实应用程序 - 看看这与在重新启动后运行你的真实应用程序而不运行普通应用程序相比如何。

    【讨论】:

    • 那么,对于启动后预热 .NET 框架,您会提出什么解决方案?
    • 答案已经有了一个想法——编写一个简单的程序来触及您感兴趣的程序集。它不需要做任何其他事情。将其设为 WinForms 应用,但不显示 UI。
    【解决方案3】:

    阅读this(改进应用程序启动时间)、this(.NET Framework 3.5 SP1 中的 CLR 优化)和this(NGen 的性能优势)。

    改善启动时间的主要思想是尽可能使用延迟初始化。不要在启动后立即实例化不必要的东西。等等等等等等。

    【讨论】:

      【解决方案4】:

      我感觉启动延迟是在 .NET 运行时将 MSIL 转换为本机代码。

      您可以在安装时生成您的程序集,这会将它们编译为本机 代码,并可能会阻止启动延迟。 WiX (http://wix.sourceforge.net) 有一个自定义操作可以做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-09
        • 2019-05-27
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2019-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多