4

C++ から C# に頻繁にデータを渡す必要があります。超低レイテンシの取引アプリケーションを書いているので、できるだけ速くする必要があります。

私は純粋な C++ プロジェクトを持っています (後で Linux に移植されます)。そこから C# プロジェクトにデータを渡す必要があります。私は常に同じ構造を渡す必要があります (これが重要な場合)。

構造は次のようになります: ティッカー = "MSFT" 価格 = "30" 出来高 = "10" サイド = "買い"

私は2つのオプションを想像します:

  • UnmanagedMemoryStream を C++ から C# に渡す C++-CLI ラッパーを作成する
  • メモリ マップト ファイルを使用する

次のようになります。

  • もっと早く
  • 実装が容易
  • Linuxへの移植が容易ですか?
4

2 に答える 2

2

混合モードの C++/CLI アセンブリの使用は、Mono ではまったくサポートされていません (こちらを参照)。Mono は純粋な CLR C++ アセンブリのみをサポートします。したがって、 Linux への移植を計画している場合は
、メモリ マップされたファイルや Matthew が提案した P/Invoke (Mono でサポートされていますが、追加の作業が必要です) などの他の可能性を使用する必要があるようです。

于 2013-02-16T22:06:35.073 に答える
1

メモリ マップト ファイルは非常に高速で、比較的使いやすいファイルです。それらを使用して、大量の ECG データを C# アプリケーションから C++ アプリケーションに転送しました。また、メモリの小さなブロック (構造体など) を転送するためにそれらを使用しました。これは、プロセス間データ転送で得られる速度とほぼ同じです。(おそらく、セマフォなどの同期メカニズムを使用して、両端からのデータの読み取り/書き込みを制御する必要があります。)

ただし、それらを Linux に簡単に移植できるかどうかはわかりませんが、Linux がある種の MMF をサポートしていることは知っているので、それほど難しくないと思います。でも、はっきりとは言えません。

注: インプロセスで実行されている DLL 内の C++ 関数にデータを転送する場合、それはまったく別の問題であり、P/Invoke を使用するだけでそれを行うことができます。P/Invoke を使用すると、MMF を使用するよりもはるかに高速になります (マーシャラーによってデータを固定でき、コピーする必要がないことが前提です)。一般的に言えば、P/Invoke を使用すると、C++ 関数へのポインターを渡すだけで済みます。

于 2013-02-16T20:34:24.237 に答える