我正在用 C# 编写一个 DSP 应用程序(基本上是一个多轨编辑器)。我已经在不同的机器上对它进行了很长一段时间的分析,我注意到了一些“好奇”的东西。
在我的家用机器上,播放循环的第一次运行占用了大约 50%-60% 的可用时间(我认为这是由于 JIT 完成了它的工作),然后对于后续循环,它会下降到稳定的 5 % 消耗。问题是,如果我在较慢的计算机上运行应用程序,第一次运行占用的时间超过可用时间,导致播放中断并弄乱输出音频,这是不可接受的。之后,它下降到 8%-10% 的消耗。
即使在第一次运行之后,应用程序也会不时地调用一些耗时的例程(或多或少每 2 秒一次),这导致稳定的 5% 消耗经历了 20%-25% 的非常短的峰值。我注意到,如果我让应用程序运行一段时间,这些峰值也会下降到 7%-10%。(我不确定这是否是由于 JIT 重新编译了这些代码部分)。
所以,我对 JIT 有一个严重的问题。虽然应用程序即使在非常慢的机器上也能很好地运行,但这些“编译风暴”将是一个大问题。我试图弄清楚如何解决这个问题,我想出了一个想法,即用一个属性标记所有“合理”例程,该属性将告诉应用程序在启动期间预先“挤压”它们,因此在真正需要时会对其进行全面优化。但这只是一个想法(我也不太喜欢它),我想知道是否有更好的解决方案来解决整个问题。
我想听听你们的想法。
(NGEN 应用程序不是一个选项,我喜欢并想要我可以获得的所有 JIT 优化。)
编辑:
内存消耗和垃圾回收不是问题,我使用的是对象池,播放期间的最大内存峰值为 304 Kb。