ProfileOptimization实际上有效吗?

时间:2012-10-19 05:41:37

标签: multicore jit .net-4.5

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

有关详细信息,请参阅here

我试过这个,但似乎对我的申请没有影响。

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

我已经按照如何启用它的说明进行操作,我可以看到创建了一个“小”(4-12KB)。但是在随后的启动中,似乎对改善启动时间没有任何影响。它仍然是1.4秒。

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

此外,对哪些代码进行“跟踪”有任何限制吗?例如:程序集加载上下文,瞬态程序集等。我问这个,因为创建的文件似乎永远不会增长,但实际上我生成了相当数量的代码(在瞬态汇编中)。

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

2 个答案:

答案 0 :(得分:21)

我们在微软使用的经验法则是,Multicore JIT可以帮助您实现NGEN启动性能的一半。因此,如果您的应用程序使用NGEN在0.1秒内启动,而在没有NGEN的情况下启动1.4秒,我们预计多核JIT启动需要大约0.75秒。

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

如果你想知道你的情况发生了什么,我们有ETW(Windows事件追踪)仪器的MCJ功能,我们将很快发布一个版本的PerfView,如果你能够收集这些事件记下你的app启动。

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

  1. 使用您的应用程序启动的PerfView收集跟踪,使用Collect-> Run或Collect->从主PerfView菜单中收集。
  2. 假设您使用了Collect->运行,将.exe的名称放在命令文本框中,选择文件名(即IronScheme.etl),从高级选项中选择后台JIT,然后单击运行命令。
  3. 关闭您的应用程序,然后双击生成的IronScheme.etl文件。
  4. 双击IronScheme.etl下面列表中的JIT Stats视图,您应该会在弹出的视图中看到类似的内容:
  5. 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是一个常见的错误。

答案 1 :(得分:10)

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

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

相关问题