0

In a C# to native lib CLI/C++ wrapper, I have a choice:

  • Store native pointer in a managed class (native object is created using native "new")

or

  • Store native object as a data blob in a managed class' field, and use pin_ptr to pin it before each native use.

Has anyone done any comparative analysis on the relative performance costs of the two paths?

Thanks!

4

2 に答える 2

1

pin_ptr は、椅子が GC によって引っ張られる可能性があることを認識していないネイティブ関数関数にアドレスが渡されるときに、マネージド ヒープ上のオブジェクトが GC によって移動されないようにするためのものです。ネイティブ ヒープまたはスタックに割り当てられたメモリには影響しません。

マネージド クラスにネイティブ オブジェクトを BLOB として格納することは、マネージド C++ が混合型に対して行ったことです。ピニングされていないガベージ コレクション ヒープ上のメモリへのポインターを返すのは簡単すぎて、後でアプリをクラッシュさせる可能性があり、この問題をデバッグするのは難しすぎます。この問題は非常に一般的であり (GC によって椅子を引っ張ることができるとは考えていません)、Microsoft は混合型を完全に無効にすることを決定したため、オブジェクトのメモリがどこにあるかを明示的に指定する必要があります。

于 2010-01-06T17:54:52.093 に答える
1

大差ないのではないでしょうか。GC 割り当ては、実際には native よりわずかに高速ですnew。また、ピニングは、GC がコレクションを行うときにオブジェクトがピニングされている場合にのみパフォーマンスの問題になります。管理対象オブジェクトが最終的に LOH に入るのに十分な大きさになった場合、固定は自由です。

しかし、私はそれを自分で測定していません。

私がしないことは、GCHandle を使用して、関数呼び出し間でオブジェクトを固定しておくことです。これは よりもセットアップに費用がかかりpin_ptr、GC に影響を与える可能性が高くなります。永続的に配置する必要があるデータについては、ネイティブ アロケーターを使用します。

于 2010-06-25T01:51:34.930 に答える