マネージド .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 がどのように機能するかはよくわかりませんが、アンマネージド コードが配列を割り当て、それがマネージド配列にコピーされ、その内容がアンマネージド配列にコピーされ、マネージド配列がガベージ コレクトされると思われます。
このインターフェイスを変更しようとするアンマネージ コードを制御することはできません。GC の負荷を軽減するために、この Read メソッドを実装するマネージ コードでできることはありますか? あるいは、このメソッドの署名を何らかの方法で変更して、GC の負荷を軽減しつつ、このインターフェイスの管理されていない署名を満たしますか?