我正在用 C# 编写 DSP 应用程序(基本上是多轨编辑器)。我已经在不同的机器上对其进行了相当长的一段时间的分析,并且我注意到了一些“奇怪”的事情。

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

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

所以,我对 JIT 有一个严重的问题。虽然应用程序即使在非常慢的机器上也能表现良好,但这些“编译风暴”将成为一个大问题。我正在尝试找出如何解决这个问题,并且提出了一个想法,即使用一个属性来标记所有“合理”例程,该属性将告诉应用程序在启动期间预先“挤压”它们,因此它们将在真正需要时得到全面优化。但这只是一个想法(我也不太喜欢它),我想知道是否有更好的解决方案来解决整个问题。

我想听听你们的想法。

(NGEN 应用程序不是一个选项,我喜欢并且想要我可以获得的所有 JIT 优化。)

编辑:

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

有帮助吗?

解决方案

您可以触发JIT编译器来编译您的整个应用程序的初始化程序中组件使用PrepareMethod ...方法(而不必使用NGen)。

此溶液在这里更详细地描述:迫使JIT编译期间运行时

其他提示

在初始速度的确听起来像融合+ JIT,这将通过ILMerge(用于融合)和NGEN(对于JIT)获得帮助;你总是可以在启动时通过系统起到无声轨迹被这样做所有的辛勤工作而无需用户干预的任何失真?

NGEN是一个很好的选择;有没有的理由的,你不能使用它?

在问题你提到的之后的初始加载做的不可以声音就像它们与JIT。也许垃圾收集。

您是否尝试过分析? CPU和存储器(集合)?

正如 Marc 提到的,持续的峰值听起来不像 JIT 问题。其他需要寻找的东西:

  • 垃圾收集 - 您是否在音频处理期间分配内存?如果您创建了大量垃圾,甚至是在第 0 代收集中幸存下来的对象,这可能会导致明显的峰值。听起来您正在执行某种预分配,但请注意库代码中的隐藏分配(甚至 foreach 循环也可以分配!)

  • 非规范化。某些类型的处理器在处理非常小的浮点数时会出现问题,这可能会导致 CPU 峰值。看 http://www.musicdsp.org/files/denormal.pdf 了解详情。

编辑:

即使您不想使用 NGen,至少也可以比较 NGen 版本,这样您就可以看到 JITing 带来的差异

如果您认为自己受到JIT的影响,然后用预编译NGEN您的应用程序,然后再次运行测试。有一个在代码中没有JIT的开销已经由NGEN编译。如果你仍然可以看到峰值在NGEN'd应用程序,那么你就知道它们不是由JIT引起的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top