3

私は2つのライブラリを持っています。最初のライブラリはvb.netで行われたオリジナルで、2番目のライブラリはc#です。

まったく同じことをします。

vb.netはc#よりも約10%高速ですが、これは非常に奇妙です

したがって、両方のコードを見ると、速度低下の原因と思われることがわかりましたIL(コードの99%近くが同じであると言えilます)。

  1. C#では、すべてのメソッド呼び出しにはありますhidebysigが、vb.netにはありません

    これはパフォーマンスの問題になる可能性がある1つのことですか?

  2. C#では、ローカル変数を使用する前に初期化する必要があります

    これはC#では機能しません

    void test()
    {
        int a;
        a += 1;
    }
    

    この意志

    void test()
    {
        int a = 0;
        a += 1;
    }
    

    これはvb.netで動作します

    Sub test()
       Dim a As Integer
       a += 1
    End Sub
    

    これは、C#でさらに2つのILラインを引き起こし、パフォーマンスの問題を引き起こすと確信しています。

  3. vb.netでは、il使用するコードを取得できないようですcall。常に使用しますcallvirtが、c#では常に使用します。call

    これはパフォーマンスの問題になる可能性がある1つのことですか?

  4. .maxstackはc#で時々大きくなります

    これはパフォーマンスの問題になる可能性がある1つのことですか?

結局、私はその10%の速度低下を取り戻す方法を理解しようとしています。これまでのところ私は無知です

ここを見てみたい場合は、自分で逆コンパイルできます。私はilspyを使用しました。

ZIPファイル、コンパイル済みバージョン
ChessEngine.dll
ChessEngineSharp.dll
ConsoleApplication1.exe

4

3 に答える 3

8

hidebysigオーバーライドされたメソッドでの名前検索の動作を制御するだけです。

これは、C#でさらに2つのILラインを引き起こし、パフォーマンスの問題を引き起こすと確信しています。

いいえ、そうではありません。同じIL、または同等のコードを生成する必要があります。VBの初期化必須です。明示的に行わない場合は、コンパイラが暗黙的に初期化を行います。

vb.netでは、呼び出しを使用するためのilコードを取得できないようです。常にcallvirtを使用しますが、c#は常にcallを使用します

私はあなたがそれを間違った方法で得たとかなり確信しています。C#は常にcallvirt仮想メソッドで使用し、VBは構文callを使用してサポートします。MyClass.Method()

実際、ベンチマークでVBが10%速いことが示されている場合は、ベンチマークにエラーがあると思われます。それ以上のことはありません。

于 2013-03-24T19:08:56.087 に答える
2

何度か実行してみましたが、システムのタイミングに特に偏りはありません。

「BenchVB」テストと「BenchC#」テストを4回実行してみたところ、次の結果が得られました。

    BenchVB, BenchC#
    Average Moves per Second
C#: 49,218,819    48,975,863    47,096,647    47,796,195
VB: 47,003,681    46,874,143    49,137,566    49,382,133

C#の方が速い場合もあれば、VBの方が速い場合もあります。少なくとも私のPC(4GHzで動作するクアッドコア、Windows 7 x64)では、大きな違いはないようです。

于 2013-03-24T19:54:03.377 に答える
0

私の問題はハードウェアに依存しているようです。自宅でのVS職場でのVSは昼と夜であり、唯一の違いはIntelデスクトップCPU(自宅)とIntelモバイルCPU(職場)です。(職場では、c#はvbよりも高速です...)

自宅では、c#/vbの数がもっと近い/似ているといいのですが

于 2013-03-25T10:43:33.673 に答える