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