【问题标题】:Does ProfileOptimization actually work?ProfileOptimization 真的有效吗?
【发布时间】:2012-11-14 07:53:32
【问题描述】:

.NET 4.5 的一项新性能增强是引入了“MultiCode JIT”。

更多详情请见here

我已经尝试过了,但它似乎对我的应用程序没有影响。

我感兴趣的原因是我的应用程序 (IronScheme) 需要很长时间才能启动,如果不是 NGEN'd,这意味着启动时会涉及相当多的 JIT'ng。 (1.4 秒对比 NGEN 时的 0.1 秒)。

我已按照有关如何启用此功能的说明进行操作,我可以看到创建了一个“小”(4-12KB)。但在后续启动时,似乎对提高启动时间完全没有影响。仍然是 1.4 秒。

有没有人在实践中真正看到(或制作)过这项工作?

另外,对哪些代码将被“跟踪”有任何限制吗?例如:程序集加载上下文、瞬态程序集等。我问这个是因为创建的文件似乎永远不会增长,但实际上我正在生成大量代码(在瞬态程序集中)。

我遇到的一个错误是SetProfileRoot 似乎不理解 / 作为路径分隔符,请务必使用 \ 。

【问题讨论】:

  • 我已经运行了一段时间,但我不知道它是否真的有效......
  • FWIW,当我为我的主应用程序(命令行应用程序)启用它时,启动时间从 1.8 秒变为 1.2 秒,性能提高了 33%。我可以通过禁用它再次重现它,所以它确实做了一些优化。

标签: multicore jit .net-4.5


【解决方案1】:

我们在 Microsoft 使用的经验法则是,多核 JIT 可以让您在 NGEN 启动性能方面取得大约一半的成绩。因此,如果您的应用在使用 NGEN 时启动时间为 0.1 秒,而在没有 NGEN 时启动时间为 1.4 秒,我们预计多核 JIT 启动大约需要 0.75 秒。

话虽如此,我们必须设置一些限制来保证程序执行顺序在有和没有 MCJ 的情况下是相同的。 MCJ 有时会暂停后台线程,等待前台线程加载模块,如果有程序集解析或模块解析事件,将中止后台编译。

如果您想了解您的情况,我们有 MCJ 功能的 ETW(Windows 事件跟踪)检测,我们将很快发布 PerfView 版本,如果您可以收集这些事件跟踪您的应用启动。

更新: PerfView 已更新,能够显示后台 JIT 信息。以下是使用最新版本 (1.2.2.0) 进行诊断的步骤:

  1. 使用 PerfView 收集应用程序启动的跟踪,可以使用 PerfView 主菜单中的 Collect->Run 或 Collect->Collect。
  2. 假设您使用了 Collect-> Run,将 .exe 的名称放在命令文本框中,选择一个文件名(即 IronScheme.etl),从高级选项中选择后台 JIT,然后单击运行命令。
  3. 关闭您的应用程序并双击生成的 IronScheme.etl 文件。
  4. 双击 IronScheme.etl 下方列表中的 JIT Stats 视图,您应该会在弹出的视图中看到如下内容:
This process uses Background JIT compilation (System.Runtime.ProfileOptimize) 
    Methods Background JITTed : 2,951 
    Percent # Methods Background JITTed : 52.9% 
    MSec Background JITTing : 3,901 
    Percent Time JITTing is Background : 50.9% 
    Background JIT Thread : 11308 

您可以单击“查看原始背景 Jit 诊断”以在 excel 中查看所有 MCJ 事件。我忘了问一个问题:你是在多核机器还是多核 VM 上运行它?在只有一个逻辑处理器的 VM 中测试 MCJ 是一个常见的错误。

【讨论】:

  • 谢谢 :) 我会告诉你结果的。
  • 不幸的是我没有看到Microsoft-Windows-DotNETRuntimePrivate/ClrMulticoreJit/Common。 “私人”后缀没有任何内容。 32/64 都试过了。
  • 原来我没有使用当前公开的 PerfView 版本。我们将在一两周内更新它,以便能够诊断 ETW 事件,我会在我们这样做时提供说明。
  • 不是想偷偷摸摸,只是不想在网络上有不好的指示 :) 感谢您分享您的应用程序,我会看看它并回复您。一旦我们发布了可以分析 MCJ 事件的 PerfView 版本,我还将更新这篇文章并提供说明。
  • 找到个人资料,谢谢。多核 JIT 似乎在我的机器上为这个应用程序工作,后台线程上发生了 1.1 秒的 JIT 时间。进程中的 CPU 活动在没有 MCJ 的情况下持续 3.9 秒,在有 MCJ 的情况下持续 2.8 秒,从启动到控制台提示停止观看应用程序从 3.2 秒变为 2.4 秒。如果您没有看到相同的结果,请坚持使用 perfview 版本,它可以告诉您机器上发生了什么。
【解决方案2】:

在启动期间调用 Activator.CreateInstance 似乎会杀死 MCJ?

或者更确切地说,触发了大会决议,这似乎完全阻止了 MCJ。之后再也不工作了。也许 MSDN 文档应该提到这一点。

【讨论】:

  • Assembly Resolve 仅在事件由某人处理时停止 MCJ。如果事件被触发但未被处理,它不会停止 MCJ。
  • 是否有任何关于 MCJ 的行为和限制(例如处理的程序集解析)的“官方”文档?到目前为止,这是我在任何地方找到的唯一提及它的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
相关资源
最近更新 更多