0

我想利用 .net 4.5 中新的多核抖动功能。

  • 我的 web.config 设置为 targetFramework="4.5"
  • IIS中的应用程序池框架设置为v4.0(据我了解,是正确的)
  • 我的处理器是具有 4 个内核(或 8 个具有超线程)的 i7 - http://ark.intel.com/products/52214/

但它似乎并没有减少 JIT 编译时间(基于性能分析),而且我看不到任何 *.prof 文件在 ASP.NET 临时文件中创建的证据。

我怎样才能找到造成这种情况的原因?

4

1 回答 1

3

后台 JIT 编译在某些特定情况下可能不起作用。您可以使用 PerfView http://www.microsoft.com/en-us/download/details.aspx?id=28567对其进行调试

从文档中可以看出,主要原因如下:

  1. 加载模块时,可能会调用模块构造函数,这可能会产生副作用(即使这种情况非常罕见)。因此,如果后台 JITTing 会导致模块比其他情况更早加载,它可能会暴露(罕见的)错误。因为后台 JIT 有一个非常高的兼容性栏,它通过使用在 JIT 编译时加载的 EXACT 模块标记每个方法来防止这种情况发生,并且只允许在所有这些 EXACT 模块也加载后进行后台 JIT 编译当前运行。因此,如果您有一个场景(比如打开菜单),有时会加载更多或更少的模块(因为之前的用户操作导致加载不同的模块),那么后台 JIT 可能无法正常工作。

  2. 如果您已将回调附加到 System.Assembly.ModuleResolve 事件,那么如果 ModuleResolve 回调在第二次运行时返回的答案与在首轮。由于这个背景,第一次调用 ModuleResolve 回调时,JIT 编译会暂停。

  3. 因为任何失败的模块查找,都会在它最终失败之前调用 ModuleResolve 事件,这意味着对失败的模块的任何探测也将禁止后台 JIT 编译。

我建议检查未通过后台 JIT 的程序集是否暴露了这些问题之一。为此,请在您的应用程序启动之前启动一个新的集合,并在完成后停止它。不要忘记检查 Advanced 部分中的Background JIT选项。

在 JITStats 部分中,您应该得到如下内容:

Total Number of JIT compiled methods : 10,673 
Total MSec JIT compiling : 9,873 
This process uses Background JIT compilation (System.Runtime.ProfileOptimize) 
WARNING: Background JIT aborted at 11,847.909 Msec 
The last assembly before the abort was 'NHibernate.XmlSerializers' loaded unsuccessfully at 11,793.741 
Methods Background JITTed : 0 
Percent # Methods Background JITTed : 0.0% 

更新

与场景 3 相关,对于 ASP.NET,ASP.NET 本身处理 ModuleResolve 事件,因此任何无法加载的模块都会导致 MCJ 在 ASP.NET 应用程序中中止。

于 2012-11-13T19:37:40.270 回答