强制.NET JIT编译器在应用程序启动期间生成最优化的代码

Tra*_*rap 14 .net c# compiler-construction optimization jit

我正在用C#编写一个DSP应用程序(基本上是一个多轨编辑器).我已经在不同的机器上进行了很长一段时间的分析,并且我注意到了一些"好奇"的东西.

在我的家用机器上,回放循环的第一次运行占用了可用时间的大约50%-60%,(我认为这是由于JIT完成其工作),然后对于后续循环,它会下降到稳定的5 % 消费.问题是,如果我在较慢的计算机上运行应用程序,第一次运行占用的时间超过可用时间,导致播放中断并弄乱输出音频,这是不可接受的.之后,它降至8%-10%的消费量.

即使在第一次运行之后,应用程序仍然不时地调用一些耗时的例程(每2秒或多或少),这导致稳定的5%消耗经历非常短的20%-25%的峰值.我注意到,如果我让应用程序运行一段时间,这些峰值也会下降到7%-10%.(我不确定这是否是由于JIT重新编译这些代码部分).

所以,我对JIT有一个严重的问题.虽然应用程序即使在非常慢的机器中也能很好地运行,但这些"编译风暴"将成为一个大问题.我正在试图弄清楚如何解决这个问题,我想出了一个想法,即用一个属性来标记所有"明智的"例程,该属性将告诉应用程序在启动时预先"挤压"它们因此,当他们真正需要时,他们将完全优化.但这只是一个想法(我也不太喜欢它),我想知道是否有更好的解决方案来解决整个问题.

我想听听你们的想法.

(NGEN应用程序不是一个选项,我喜欢并希望我能获得所有JIT优化.)

编辑:

内存消耗和垃圾收集没有问题,我正在使用对象池,播放期间的最大内存峰值为304 Kb.

Lir*_*ran 17

您可以使用PrepareMethod...方法触发JIT编译器在应用程序初始化例程期间编译整个程序集集(无需使用NGen).

此处详细介绍了此解决方案:在运行时强制JIT编译.