Asp.net 4.5“多核jitting”无法正常工作

时间:2012-07-10 11:17:11

标签: jit asp.net-4.5

我想利用.net 4.5中新的多核点击功能。

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

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

如何找出原因?

1 个答案:

答案 0 :(得分:3)

后台JIT编译在某些特定方案中可能不起作用。您可以使用PerfView http://www.microsoft.com/en-us/download/details.aspx?id=28567

进行调试

从文档中,主要原因如下:

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

  2.   
  3. 如果您已将回调附加到System.Assembly.ModuleResolve事件,那么如果ModuleResolve回调在第二个回复时返回不同的答案,那么背景JITing可能会产生副作用(尽管设计极其不可能且非常糟糕)跑比第一次跑。由于这个背景,JIT编译在第一次调用ModuleResolve回调时被挂起。

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

  6.   

我建议检查后台JIT失败的程序集是否暴露了其中一个问题。为此,请在应用程序启动之前启动一个新的Collection,并在完成后停止它。不要忘记检查“高级”部分中的后台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应用程序中中止。