速度 - c++ と は




C++ CLI ネイティブパーツは純粋なC++で書かれていますが、純粋なネイティブC++と同じくらい速くCLIでコンパイルされていますか? (3)

オーディオコンピューティングをC ++レイヤに委任したいのですが、WPF GUIを介してオーディオコンテンツを処理および編集したいと思います。

私はC ++ / CLIを簡単に見てきました、そして私は知りたいと思いました:

  • C#GUIとC ++オーディオ管理の中間層としてC ++ / CLIを使用するべきですか
  • あるいは、単にコードをC ++ / CLIに入れ、それが同じ方法でコンパイルされることを期待しているので、効率的です。

編集:燃えるような戦争が始まるかもしれないように。 これはベンチマークゲームへのリンクであり、C / C ++をスピードの勝者として明確に述べています。 私は尋ねています:私は私のC ++をC ++ DLLまたはC ++ CLIアセンブリで書くべきです。


C ++ / CLIでは、管理型(たとえばref class )とそのメンバはMSILにコンパイルされます。 これは、SIMDを使用しないこと、および最適化がはるかに少ないことを意味します(少なくとも現在の.NETバージョンでは、Microsoftの理由はすぐには変わりませんが、トレードオフの評価は変わる可能性があります)。

一方、ネイティブ型は、MSILまたはネイティブのマシンコードのいずれかにコンパイルできます。 Visual C ++には世界で最高のC ++オプティマイザがありませんが、非常に優れています。 だから私のお勧めはネイティブコードにコンパイルすることでしょう。 マネージコードとネイティブコードの間の呼び出しにVisual C ++はC ++相互運用機能を使用します。これは非常に効率的です(文字列連結など、すべての.NETの組み込み関数に使用されているものと同じinternalcall呼び出しテクノロジです)。

これを実現するには、タイムクリティカルなコードを別のオブジェクトファイル(別のDLLではなく、リンカにマネージコードとアンマネージドコードを組み合わせて "混在モード"アセンブリにまとめる)に入れるか、または/clrかっこを付けてコンパイルします。 #pragma managed(push, off) ... #pragma managed(pop) どちらの方法でも最大限の最適化が得られ、非常に高速なコードにSIMD組み込み関数を使用することができます。


C ++ / CLIレイヤのブリッジングは、管理状態がプリミティブ型に変換されてアンマネージドレイヤにマーシャリングされ、処理されてからマーシャリングされるマーシャリング作業です。 あなたのアルゴリズム(そしてその遷移層を "ラッピング"するための語用論)にもよりますが、マーシャリングをできる限り制限された(小さい)ものにすることが最善です。

最も単純な問題は、C ++ / CLIレイヤを介して小さなプリミティブデータを送信し、長い時間を処理してから、小さなデータを返信するインタフェースです(たとえば、最小限のマーシャリングオーバーヘッド)。 もしあなたのアルゴリズムがC ++ / CLI層を越えてもっと広範囲の相互作用を必要とするなら、それはかなりもっとトリッキーになります。

"All C#"または "All Managed"の利点は、(1)この整列化レイヤをスキップすること(オーバーヘッドがあり、作業によっては面倒なことがある)、および(2).NETエンジンが実行できるランタイム最適化にあります。コードが実行されている特定のコンピュータ(ネイティブC / C ++でもアンマネージコードでも使用できません)。

私はあなたがあなたのシナリオでそれを「テストする」べきである/しなければならないというこのスレッドの他のコメントに同意します。 パフォーマンスに敏感な移行を伴う「大きな」C ++ / CLIレイヤは、管理されているものと管理されていないものとの間でジャンプし続けると(自動的に)発生する「ボクシング/アンボクシング」のため、非常に困難です。

最後に、ハイブリッドの「マネージド/アンマネージド」デザインと「オールマネージド」デザインの究極のパフォーマンスの違いは、以下の間のトレードオフに関係しています。.NETエンジンは、.NETコードのマシン固有の最適化を行うことができますか。 (混在モードアセンブリにリンクされている)「純粋なネイティブ」コードよりも、マシン固有のスレッド/コア/レジスタを利用して).NETエンジン(インタープリタ)をバイパスすることでFASTを処理できますか。

真の、よく書かれたネイティブコードはプロセッサスレッドを「検出」することができますが、通常はそのマシン固有のレジスタを検出することはできません(そのターゲットプラットフォーム用にコンパイルされていない限り)。 これとは対照的に、ネイティブコードは.NETランタイムを通過するという「オーバーヘッド」はありません。これは単なる仮想マシンです(特定の基盤となるハードウェアへのロジックのJust-In-Timeコンパイルによって「加速」される場合があります)。

複雑な問題 ごめんなさい。 「パフォーマンス重視」があなたの問題であるならば、私見、この種の問題に関する簡単な答えはただありません。


私が行ったC#についての私のテストでは、アルゴリズム用のネイティブC ++よりも高速です。 唯一の欠点は、インターネット上のC#よりもC ++のアルゴリズムが少ないことです。





c++-cli