2010-12-06 40 views
9

おはよう、ネイティブC++と比較したC++/CLIのパフォーマンス?

この場合、パフォーマンスに重大なスペルチェッカーが書かれています。つまり、DBに接続してC#でGUIを作ろうとしているので、Cで編集距離計算ルーチンを書いて、C#で使用するDLLにDllImportを使ってコンパイルしました。問題は(私が間違っているかもしれませんが)からchar *へのマーシャルワードが1つずつオーバヘッドを引き起こしていると思います。つまり、私はC++/CLIを使って、String型の.NETで直接作業できるように考えました。私の質問は、C++/CLIのパフォーマンスと、重い数学的計算と配列アクセスのためのネイティブCコードとの比較です。

ありがとうございました。

+0

私は、CILは同じだが暗黙的に行うと思います。 –

+0

なぜあなたは単語を一つずつ通すのですか? txt全体を渡す。 –

答えて

4

C++/CLIもマーシャリングを行う必要があります。

パフォーマンスに関するすべての問題と同様に、を測定し、最適化する必要があります。 C#があなたの目的に十分に速くないと確信していますか? JITコンパイラが行う最適化を過小評価しないでください。言語実装のオーバーヘッドを推測せずに管理するためだけに推測しないでください。十分でない場合は、アンマネージコードを試す前に、安全でないC#コード(ポインタ付き)を考慮しましたか?

C++/CLIのパフォーマンスプロファイルに関しては、実際の使用方法によって異なります。マネージコード(CIL)を(/clr:pure)でコンパイルすると、C#と大きく異なることはありません。 C++/CLIのネイティブC++関数は、プレーンC++と同様のパフォーマンス特性を持ちます。ネイティブC++環境とCLI環境の間でオブジェクトを渡すと、オーバーヘッドが発生します。

+0

安全でないC#コードは、DllImportでインポートするC関数の約2倍の遅さです。 – Miguel

1

私は、ボトルネックがDLLImportにあるとは思わないでしょう。
私はDLLImportを毎秒何回も呼び出すプログラムを書いていますが、うまくいきます。
あなたは小さなパフォーマンス罰金を支払うが、罰金は小さい。

1

最適化する必要があることが分かっていないと考えてください。サンプリングを教えてください。

私はいくつかのスペルを修正しました。私がやったやり方(outlined here)は、メモリ内のトライとして辞書を編成し、それを検索することでした。 単語の数が多い場合、共通接尾辞を共有することによって、トライのサイズを大幅に縮小できます。

+0

それはそうではありません...私は実際にはBKツリーを使用しているので、私のアプローチはあなたが言ったものとはかなり異なっています。 – Miguel

+0

@Miguel:OK、訂正。いずれにしても、私がしたことは、トライでブランチ・アンド・バウンド検索でした。これはかなりうまく機能しました。代わりに、深さ優先/幅優先が混在していますが、ブランチとバウンドはほぼ同じパフォーマンスであり、扱うことができるスペルの種類に関してはるかに柔軟性があると思いました。 –

関連する問題