Mic*_*lli 14 c# c++ multithreading garbage-collection
我有一个由许多C#项目组成的解决方案.它是用C#编写的,以使其快速运行.垃圾收集开始成为一个问题 - 我们正在看到我们想要避免的100毫秒延迟.
一种想法是用C++重新编写它,逐个项目.但是,如果将C#与非托管C++结合使用,C++项目中的线程是否也会被垃圾收集冻结?
谢谢你的回复.事实上,这是一个100毫秒可能很重要的应用程序.在C#中构建它可能是一个糟糕的决定,但它必须在当时快速启动并运行.
现在,我们正在使用Windows的多媒体计时器每隔5毫秒触发一次事件.我们确实看到了100多个ms的间隙,我们通过检查GC计数器确认这些间隙总是在收集期间发生.优化正在进行; 内置于发布模式.
我在一家贸易公司担任.NET开发人员,与您一样,我们关心100毫秒的延迟.当需要可靠的最小延迟时,垃圾收集确实会成为一个重要问题.
也就是说,我不认为迁移到C++会是一个聪明的举动,主要是因为它会耗费多少时间.在堆上分配了一定量的内存后,会发生垃圾收集.您可以通过最小化代码创建的堆分配量来大大缓解此问题.
我建议您尝试在应用程序中发现负责大量分配的方法.构建Anywhere对象将成为修改的候选对象.打击垃圾收集的经典方法是利用资源池:不是每次调用方法时都创建新对象,而是维护已构造对象池,在每次方法调用时从池中借用并将对象返回到池中该方法已经完成.
另一个明智的做法是在代码中搜索任何ArrayList,HashTable或类似的非泛型集合,即box/unbox值类型,从而导致完全不必要的堆分配.以替换这些List<T>,Dictionary<TKey, TValue>等在可能的情况(在这里我特别是指以价值类型,如集合int,double,long等).同样,请注意您可能正在调用哪些方法值类型参数(或返回盒装值类型).
这些只是您可以采取的几个相对较小的步骤来减少垃圾收集计数,但它们可以产生很大的不同.通过足够的努力,甚至可以在应用程序的连续操作阶段(除了启动和关闭之外的所有阶段)完全(或至少几乎)消除所有第2代垃圾收集.而且我认为你会发现第2代系列是真正的重击手.
这篇文章概述了一家公司通过资源池最小化.NET应用程序延迟的努力,以及其他几种方法,并取得了巨大成功:
Rapid Addition利用Microsoft .NET 3.5 Framework构建超低延迟的FIX和FAST处理
所以重申:我强烈建议调查修改代码的方法,以便减少垃圾收集而不是转换为完全不同的语言.