我在一家贸易公司担任.NET开发人员,我们像你一样关注100毫秒的延迟。当需要可靠的最小延迟时,垃圾回收确实可能成为一个重要问题。
话虽如此,我认为迁移到C++并不是一个聪明的举动,主要是因为它需要耗费大量时间。垃圾回收会在内存堆上分配了一定量的内存后进行。您可以通过最小化代码创建的堆分配量来
大大减轻这个问题。
我建议尝试查找应用程序中负责大量分配的方法。构造对象的任何地方都将成为修改的候选对象。对抗垃圾回收的经典方法是利用
资源池:不要每次调用方法时都创建一个新对象,而是维护已经构造好的对象池,在每次方法调用时从池中借用并在方法完成后将对象返回给池。
另一个容易的优化方法是寻找代码中使用的任何
ArrayList
、
HashTable
或类似的非泛型集合,这些集合会对值类型进行装箱/拆箱操作,导致完全不必要的堆分配。尽可能使用
List<T>
、
Dictionary<TKey, TValue>
等替换它们(这里特别指的是值类型的集合,例如
int
、
double
、
long
等)。同样,注意任何可能装箱值类型参数(或返回装箱值类型)的方法。
这些只是减少垃圾回收次数的一些相对较小的步骤,但它们可以产生很大的影响。付出足够的努力,甚至可以在应用程序的连续操作阶段(除了启动和关闭之外的所有阶段)完全(或至少近乎完全)消除
所有第二代垃圾回收。我认为你会发现第二代回收才是真正的重头戏。
以下是一篇论文,概述了一家公司通过资源池化以及其他方法来最小化.NET应用程序中的延迟,并取得了巨大成功。
Rapid Addition利用Microsoft .NET 3.5框架构建超低延迟的FIX和FAST处理
因此,我强烈建议您研究修改代码的方法,以减少垃圾回收而不是转换为完全不同的语言。