我在托管的.net应用程序中遇到了性能问题。 我使用COM连接到非托管库,在运行期间我注意到在Process Explorer中我的GC中的%Time在大多数情况下非常高,> 90%。
我使用了VS 2012内存分析,它显示我的大部分内存分配都在一个名为COMToCLRDispatchHelper的.NET方法中进行。基本上,我的应用程序分配的所有内存的98%都是在这个方法中完成的,我想知道可以做些什么来解决这个问题,因为这会降低我的应用程序性能。
在进一步调查时,我怀疑GC时间的高%是由非托管库经常通过COM接口调用我的托管代码引起的,该接口具有如下签名:
int Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data, uint size);
我不太清楚MarshalAs是如何工作的,但我怀疑非托管代码会分配一个数组,然后将其复制到托管数组中,然后将其内容复制回非托管数组,托管数组就是垃圾收集。
我无法控制非托管代码以尝试更改此界面。 我是否可以在托管代码中执行此方法来实现此Read方法以缓解GC压力?或者可能以某种方式更改此方法的签名,以缓解GC压力但仍满足此接口的非托管签名?