Interop (C++) のパフォーマンスに関する考慮事項Performance Considerations for Interop (C++)

このトピックでは、実行時のパフォーマンス上の相互運用機能の遷移をマネージ/アンマネージの影響を減らすためのガイドラインを提供します。This topic provides guidelines for reducing the effect of managed/unmanaged interop transitions on run-time performance.

Visual C は、Visual Basic および c# (P/invoke) などの他の .NET 言語と相互運用性のと同じメカニズムをサポートしていますが、Visual C (C++ 相互運用機能) に固有の相互運用機能のサポートも提供します。Visual C++ supports the same interoperability mechanisms as other .NET languages such as Visual Basic and C# (P/Invoke), but it also provides interop support that is specific to Visual C++ (C++ interop). パフォーマンスが重要なアプリケーションの場合、それぞれの相互運用機能の手法のパフォーマンスに影響を理解しておく必要があります。For performance-critical applications, it is important to understand the performance implications of each interop technique.

使用する相互運用機能手法に関係なく、サンクと呼ばれる特殊な遷移のシーケンスが必要です、マネージ関数は、非管理対象の関数、またはその逆を呼び出すたびに。Regardless of the interop technique used, special transition sequences, called thunks, are required each time a managed function calls an unmanaged function and vice versa. このサンクは、Microsoft によって自動的に挿入C++、コンパイラは累積的に、これらの遷移できるパフォーマンスの観点からコストを念頭に重要です。These thunks are inserted automatically by the Microsoft C++ compiler, but it is important to keep in mind that cumulatively, these transitions can be expensive in terms of performance.

遷移の削減Reducing Transitions

回避またはサンクの相互運用のコストを削減する方法の 1 つでは、マネージ/アンマネージの遷移を最小限に抑えるに関連するインターフェイスをリファクターします。One way to avoid or reduce the cost of interop thunks is to refactor the interfaces involved to minimize managed/unmanaged transitions. 大幅なパフォーマンス改善を chatty なインターフェイスをマネージ/アンマネージの境界を越えて呼び出し頻度を持たないようなソリューションを対象として指定します。Dramatic performance improvements can be made by targeting chatty interfaces, which are those that involved frequent calls across the managed/unmanaged boundary. ループでアンマネージ関数を呼び出すマネージ関数は、たとえば、リファクタリングの適切な候補は。A managed function that calls an unmanaged function in a tight loop, for example, is a good candidate for refactoring. ループ自体は、アンマネージ側に移動またはアンマネージ呼び出しが作成された場合、管理対象の代わりに (マネージ側のデータをキューにして、ループの後にすべて一度にアンマネージ API にマーシャおそらく) 遷移の数は、符号を削減ificantly します。If the loop itself is moved to the unmanaged side, or if a managed alternative to the unmanaged call is created (perhaps be queuing data on the managed side and then marshaling it to the unmanaged API all at once after the loop), the number of transitions can be reduced significantly.

P/invoke vs します。C++ InteropP/Invoke vs. C++ Interop

Visual Basic や c# などの .NET 言語は、ネイティブ コンポーネントとの相互運用の所定の方法は、P/invoke が。For .NET languages, such as Visual Basic and C#, the prescribed method for interoperating with native components is P/Invoke. P/invoke は、.NET Framework でサポートされる、ため、Visual C を同様に、そのサポートしますが、Visual C では、C++ Interop と呼ばれる独自の相互運用性サポートも提供します。Because P/Invoke is supported by the .NET Framework, Visual C++ supports it as well, but Visual C++ also provides its own interoperability support, which is referred to as C++ Interop. C++ Interop は、P/invoke がタイプ セーフではないために、P/invoke 経由で優先します。C++ Interop is preferred over P/Invoke because P/Invoke is not type-safe. その結果、実行時にエラーが報告される主が C++ Interop は P/invoke 経由でパフォーマンス上の利点もあります。As a result, errors are primarily reported at run time, but C++ Interop also has performance advantages over P/Invoke.

両方の手法では、マネージ関数は、アンマネージ関数を呼び出す際にいくつかの処理が必要です。Both techniques require several things to happen whenever a managed function calls an unmanaged function:

  • 関数呼び出しの引数は CLR からネイティブ型にマーシャ リングされます。The function call arguments are marshaled from CLR to native types.

  • マネージとアンマネージ サンクが実行されます。A managed-to-unmanaged thunk is executed.

  • (引数のネイティブ バージョンを使用)、アンマネージ関数が呼び出されます。The unmanaged function is called (using the native versions of the arguments).

  • アンマネージからマネージへのサンクが実行されます。An unmanaged-to-managed thunk is executed.

  • 戻り値の型と"out"または"で, out"引数は、ネイティブ コードから CLR 型にマーシャ リングされます。The return type and any "out" or "in,out" arguments are marshaled from native to CLR types.

マネージ/アンマネージ サンクは、相互運用機能をすべての機能が、関連するデータ型、関数シグネチャ、およびデータの使用方法によって異なりますが、必要なデータのマーシャ リングします。The managed/unmanaged thunks are necessary for interop to work at all, but the data marshaling that is required depends on the data types involved, the function signature, and how the data will be used.

最も簡単なフォームは、C++ 相互運用機能によって実行されるデータのマーシャ リングしますパラメーターは単にコピー; ビットごとの方法でマネージ/アンマネージ境界を越えて。変換は実行されませんで。The data marshaling performed by C++ Interop is the simplest possible form: the parameters are simply copied across the managed/unmanaged boundary in a bitwise fashion; no transformation is performed at all. P/invoke では、これはすべてのパラメーターは、簡単な場合は true。 blittable 型です。For P/Invoke, this is only true if all parameters are simple, blittable types. それ以外の場合、P/invoke は各管理対象のパラメーターを適切なネイティブ型に変換するには非常に堅牢な手順を実行します。 引数は、"out"としてマークされている場合にその逆の場合、または"で, out"。Otherwise, P/Invoke performs very robust steps to convert each managed parameter to an appropriate native type, and vice versa if the arguments are marked as "out", or "in,out".

つまり、C++ Interop は、P/invoke は、最も堅牢なメソッドを使用して、データのマーシャ リングの最も速い方法を使用します。In other words, C++ Interop uses the fastest possible method of data marshaling, whereas P/Invoke uses the most robust method. つまり、C++ Interop (C++ の標準的な方法) では、既定では、最適なパフォーマンスを提供および、この動作がない場合または安全で適切なアドレス指定するため、プログラマが担当します。This means that C++ Interop (in a fashion typical for C++) provides optimal performance by default, and the programmer is responsible for addressing cases where this behavior is not safe or appropriate.

したがって、C++ 相互運用機能には、データのマーシャ リングし、明示的に指定する必要がありますが、利点は、プログラマが、データの性質に応じて、適切な新機能とが使用されるようにする方法を決定することが必要です。C++ Interop therefore requires that data marshaling must be provided explicitly, but the advantage is that the programmer is free to decide what is appropriate, given the nature of the data, and how it is to be used. さらに、P/invoke データのマーシャ リングの動作は、ある程度カスタマイズで変更できます、C++ Interop できますデータ マーシャ リングの呼び出しによってごとにカスタマイズします。Furthermore, although the behavior of P/Invoke data marshaling can be modified at customized to a degree, C++ Interop allows data marshaling to be customized on a call-by-call basis. これは、P/invoke でことはできません。This is not possible with P/Invoke.

C++ 相互運用機能の詳細については、次を参照してください。を使用して C++ Interop (暗黙の PInvoke)します。For more information about C++ Interop, see Using C++ Interop (Implicit PInvoke).

関連項目See also

混在 (ネイティブおよびマネージド) アセンブリMixed (Native and Managed) Assemblies