0

我在托管的 .net 应用程序中遇到了性能问题。我正在使用 COM 与非托管库进行接口,在运行时我注意到在 Process Explorer 中我的 GC 时间百分比在大多数情况下都非常高,> 90%。

我使用了 VS 2012 内存分析,它表明我的大部分内存分配都在一个名为 COMToCLRDispatchHelper 的 .NET 方法中进行。基本上,我的应用程序分配的所有内存中超过 98% 都是通过这种方法完成的,我想知道可以做些什么来解决这个问题,因为这会降低我的应用程序性能。

在进一步调查中,我怀疑 GC 时间的高百分比是由非托管库经常通过具有如下签名的 COM 接口调用我的托管代码引起的:

int Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] data, uint size);

我不太了解 MarshalAs 的工作原理,但我怀疑非托管代码分配了一个数组,然后将其复制到托管数组中,然后将其内容复制回非托管数组,托管数组被垃圾收集。

我无法控制非托管代码来尝试更改此接口。在实现此 Read 方法以缓解 GC 压力的托管代码中,我可以做些什么吗?或者也许以某种方式更改此方法的签名以减轻 GC 压力但仍满足此接口的非托管签名?

4

0 回答 0