-5

つまり、これが現在の状況です。同じソリューションでC#GUIプロジェクトとC#エンジンプロジェクトを組み合わせています。GUIを使用すると、ユーザーや一部の高レベルのものなどと対話できます。エンジンの機能は、別のサードパーティアプリケーションと通信することです。エンジンには、サードパーティアプリケーションに接続するソケットがあり、メッセージをオブジェクトに変換してサードパーティアプリケーションに送信し、サードパーティアプリケーションからの応答をリッスンしてそれに応じて反応するメソッドもあります。エンジンとサードパーティアプリケーション間で通信されるデータは、オブジェクトにパッケージ化されます。C#エンジンの問題は、速度が遅すぎることです。したがって、アイデアは、速度を上げるためにエンジンをアンマネージC++に変換することです。これが私の攻撃計画です。

  1. C#エンジン全体を手作業でC ++に変換します(C#エンジンにはスレッドとハッシュテーブルが含まれているため、これはすでにかなり困難です)
  2. C ++のコンストラクター、アクセサー、ミューテーターの代わりに次のものを用意します。

    void* CreateInstance()
    {
        MyClass* p = new MyClass();
        return p;
    }
    
    void ReleaseInstance(void* pInstance)
    {
        MyClass* p = (MyClass*)pInstance;
        delete p;
    }
    
    int GetData(void* pInstance)
    {
        MyClass* p = (MyClass*)pInstance;
        return p->GetData();
    }
    
    void SetData(void* pInstance, value)
    {
        MyClass* p = (MyClass*)pInstance;
        p->SetData(value);
    }
    

    (C ++で実際のクラスを使用できない理由は、C#でC ++オブジェクトをインスタンス化できないためです)

  3. 次に、C ++アンマネージDLLをビルドし、C#GUIプロジェクト([DllImportなど])内でP /Invokeを使用してすべてのC++メソッドにアクセスし、それを使用してC#エンジンを置き換えます。オブジェクトはメソッドを使用してシミュレートされ、C#GUIとC++エンジンの間でやり取りされます。

この時間のかかるタスクに着手する前に、C ++に変換してこのメ​​ソッドを介してC#GUIに再インポートすることが不可能なC#コードはありますか?

4

1 に答える 1

2

C++ に変換できない C# コードはありません。ただし、使用する C++ ライブラリでカバーされていないライブラリ関数が .NET にあるかどうかを調べることをお勧めします。再発明する車輪に行き詰まっていないことを確認してください。

とはいえ、私の実際の経験では、現実世界の C++ コードは現実世界の C# コードより自然に高速というわけではありません。確かに、C++ プログラマーは、より優れたパフォーマンスを得るために利用できるより多くのトリックを持っていますが、その点に到達するための努力は、多くの場合、非常に手ごわいものになる可能性があります。リコ・マリアーニとレイモンド・チェンの間の競争の有名なケースを考えてみましょう。Chen の最終バージョンが Rico のバージョンよりも有利だったのは、最終的には、.NET ランタイムがブートストラップするのに必要な時間だけでした。これは、実行時間の長いプロセスでは無視できるわずかなオーバーヘッドです。

そのため、まずパフォーマンス プロファイラーを使用して、C# コードが遅い理由と、コードを高速化するために何ができるかを確認することを強くお勧めします。そのルートをたどることで、ほんのわずかな労力で、必要に応じて十分な速さでコードを実行できる可能性が非常に高くなります。より良いデータ構造を選択するだけで、どれだけ印象的に見えるかは驚くべきことです。

于 2012-05-18T22:09:42.457 に答える