3

私は.Netプログラミングに非常に慣れていません.約1年です。

数日前、好奇心から、混合モードのアセンブリに関連するいくつかの記事をチェックしましたが、これの多くを理解するのに苦労しています。

  1. P/Invoke が C#/VB.NET で簡単に実行できるのに、なぜ Microsoft は Mixed-Mode アセンブリを導入したのですか?

  2. 混合モード アセンブリは、純粋な .Net アセンブリよりも高速に実行されますか?

.Net は CLR であるため (VM によく似ています)、混合モードでコンパイルされたアセンブリも CLR になり、最終的にパフォーマンスが低下するのではないかと思います。

私の混乱を助けてください!

4

1 に答える 1

6

混合モード アセンブリの主な使用例は、既存のC または C++ コードと相互運用する必要がある場合です。もちろん非常に一般的です。

設計上、コードが高速になるわけではありません。マネージ コードからネイティブ コード実行への移行にはコストがかかります。これは非常に最適化されており、適切に実行すれば、ガベージ コレクターが認識したスタックに Cookie を書き込むコストのみを支払うだけで、オブジェクト参照のアンマネージ スタック フレームを調べることを回避できます。コストはかかりますが、ほんの一握りの CPU サイクルです。ただし、データを翻訳する必要がある場合は、追加費用が発生する場合があります。標準的な例である文字列。または、管理対象オブジェクトを固定して、コレクターが移動できないようにします。配列が標準的な例です。

しかし、確かに混合モード アセンブリを使用してパフォーマンスの問題を解決できます。移行の回数を制限でき、高度に最適化されたコードを生成する C または C++ コンパイラの機能を活用できれば、先を行くことができます。あなたがそうするという魔法の公式はなく、確かにジッターを打ち負かすのはそれほど簡単ではありません. 時間の制約の下で動作することを考えると、C コンパイラのオプティマイザーに勝るものはありませんが、かなり効果的なオプティマイザーを備えています。作成するコードの品質が最も重要です。

最初は常にプロファイラーを使用して、NG を排除し、実際のホット スポットを見つけて、試す価値があることを確認してください。

于 2012-12-08T16:47:39.547 に答える