2011-09-30 8 views
5

私は同じDLLを使用するwin32 dllと2つのアプリケーションを持っています。 1つはアンマネージ空間でcを使用して記述され、もう1つはPinvokesを使用してアンマネージコードを呼び出す.netアプリケーションです。管理対象コードからアンマネージコードを呼び出すパフォーマンス

時々、.netアプリケーションのパフォーマンスがcアプリケーションより優れています。技術的に言えば、.netからアンマネージコードを呼び出すと、パフォーマンスのオーバーヘッドが発生しますが、この場合は発生しません。

私はmsdnリファレンスをチェックしました。実際の呼び出しが行われる前に何らかの前処理が行われているようです。リンケージ中にdllが読み込まれます。

私はどのようなシナリオでネットアプリケーションが優れているのか理解したいですか?

+2

どのように2つのアプリケーションのパフォーマンスを測定し、他のすべてのロジックはまったく同じですか? –

+1

一般的にネイティブコールは速くなければなりません。http://www.codeproject.com/KB/dotnet/pinvokeperformance.aspx測定値は正しいですか? –

+0

@AvadaKedavra - 私は、それぞれnetとcアプリケーションのストップウォッチと時間を使って特定のメソッド呼び出しを測定しました。 – sundar

答えて

5

pinvoke marshallerは、.NETフレームワークで最も重く最適化されたコードチャンクの1つです。非常に重要なのは、管理されていないオペレーティングシステムで管理対象プログラムを実行しているときに見えないピンボケがたくさんあることです。オーバーヘッドの量は非常に変化しやすい。 DLLが既にロードされており、ピンポークされた関数への引数が単純な整数型であるのは、CPUサイクルのほんの一例です。たとえば、文字列の変換が必要な場合は、何百回ものサイクルが必要です。

ネイティブコールよりも速いことはありません。わずかなサイクルで正確なオーバーヘッドを測定することは困難です。また、ピンポークコールではなく、意図せずにテストプログラムのパフォーマンスを測定する可能性があることに注意してください。

関連する問題