【问题标题】:Managed Debugging Assistant(MDA) jitCompilationStart usage托管调试助手 (MDA) jitCompilationStart 用法
【发布时间】:2013-05-15 11:38:19
【问题描述】:

我正在尝试优化某些 WinForms 应用程序的冷启动时间。我已经对所有程序集进行了 NGen 处理,但仍然看到调用了 JIT。我启用了 MDA 的 jitCompilationStart 并看到来自 MDA 的运行时异常说某些东西导致了 JIT 的调用。

我的问题是 - 现在怎么办?我看到的是建议的调试器列表。如果我从列表中选择 sthm - 我在 VS 中什么也看不到。应用程序继续执行,仅此而已。如何获取有关应用程序的哪一部分调用 JIT 的信息?

我在 Debug->Exceptions -> Managed Debugging Assistants 中启用了 JitCompilationStart:

【问题讨论】:

  • 您是在调试器下运行代码吗?来自msdn.microsoft.com/en-us/library/d21c150d.aspx:“启用 MDA 后,即使您的代码未在调试器下执行,它仍处于活动状态。如果在调试器不存在时引发 MDA 事件,则事件消息将显示在未处理的异常对话框中,尽管它不是未处理的异常。为避免出现该对话框,请在您的代码不在调试环境中执行时删除启用 MDA 的设置。"
  • @MarcSherman 如果没有附加调试器,则会出现异常对话框。如果我在启动时将 VS 附加到 WinForms 进程,则不会出现异常对话框,并且应用程序可以正常工作。但我没有看到任何来自 MDA 的日志或类似的东西。
  • 从阅读有关 jitCompilationStart MDA 的信息中可以看出,它只报告 JIT 事件,所以也许你成功地摆脱了它们。如果你在 VS 上运行它并附加了一个根本不是 NGen 的程序版本,会发生什么?你看到 JIT 事件了吗?

标签: .net visual-studio-2010 debugging optimization


【解决方案1】:

那个 MDA 是为了在抖动开始时附加一个调试器。要求是一个已注册的非托管调试器,它能够调试 C++ 代码以及抖动的源代码。您已经满足了第一个要求,VS20120 和 VS2012 具有出色的非托管调试器。对于像你我这样的凡人来说,后者是相当困难的。整个场景只对 Microsoft SDET 感兴趣。

显然,您在诊断冷启动延迟方面走错了路。在不止一个方面,抖动是一个开始细节。冷启动主要取决于磁盘查找程序集文件所需的时间。实际上,使用 Ngen 正是您想要做的,它使需要查找的文件数量增加了一倍。只有改善热启动时间才有好处。

对于冷启动延迟只有三种好的解决方案。使用更少的程序集,ILMerge 可以提供帮助。使用更快的磁盘,SSD 有很大帮助。并且作弊,在登录时启动一个小型的无操作 .NET 程序,将程序集加载到文件系统缓存中。在用户启动您的 .NET 应用程序一段时间后,这实际上是自动的,Windows prefetcher 学习并预加载 DLL。很难注意到,除了客户在一段时间后停下来抱怨。

【讨论】:

  • 谢谢,更新了问题 - 术语错误。当然是热启动。无论如何,为什么我在带有附加 VS 的小尖峰应用程序中看到 jitCompilationStart 输出,但在带有附加 VS 的大应用程序中看不到任何 MDA 输出。大应用程序运行时存在 MDA 异常。为什么他们没有被附加的 VS 捕获?
  • 现在我发现了异常。 ngen'ing 泛型集合是否存在一些问题?
  • 你完全否定了我的回答。你不能这样做。再次点击可提出另一个问题。
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多