我想利用.net 4.5中新的多核点击功能。
但它似乎没有减少JIT编译时间(基于性能分析),我看不到在ASP.NET临时文件中创建任何* .prof文件的证据。
如何找出原因?
答案 0 :(得分:3)
后台JIT编译在某些特定方案中可能不起作用。您可以使用PerfView http://www.microsoft.com/en-us/download/details.aspx?id=28567
进行调试从文档中,主要原因如下:
加载模块时,可以调用模块构造函数,这可能会产生副作用(即使这种情况非常罕见)。因此,如果后台JITTing会导致模块加载的时间比其他情况更早,则可能会暴露(罕见)错误。因为后台JIT具有非常高的兼容性条,所以它通过使用在JIT编译时加载的EXACT模块对每个方法进行分级来防止这种情况,并且只允许它们在所有这些EXACT模块也被加载后进行后台JIT编译。目前的运行。因此,如果您有一个场景(例如菜单打开),有时会加载更多或更少的模块(因为以前的用户操作导致加载不同的模块),那么后台JIT可能无法正常工作。
如果您已将回调附加到System.Assembly.ModuleResolve事件,那么如果ModuleResolve回调在第二个回复时返回不同的答案,那么背景JITing可能会产生副作用(尽管设计极其不可能且非常糟糕)跑比第一次跑。由于这个背景,JIT编译在第一次调用ModuleResolve回调时被挂起。
- 醇>
因为任何模块查找失败,WILL会在最终失败之前调用ModuleResolve事件,这意味着任何探测失败的模块也会禁止后台JIT编译。
我建议检查后台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应用程序中中止。