为什么C#性能比VB慢

Fre*_*dou 3 c# vb.net

我有两个库,第一个是在vb.net中完成的原始文件,第二个是在c#中.

做同样的事情.

vb.net比c#快10%左右,非常奇怪

所以我发现似乎是减速的原因,通过查看IL两者的代码是(我会说接近99%的il代码是相同的);

  1. 在c#中所有方法调用都有,hidebysig但在vb.net中没有

    这一件事可能是性能问题吗?

  2. 在c#中,您必须在使用之前初始化局部变量

    这不会在c#中工作

    void test()
    {
        int a;
        a += 1;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这将

    void test()
    {
        int a = 0;
        a += 1;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    而这工作在vb.net

    Sub test()
       Dim a As Integer
       a += 1
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)

    在c#中导致2个更多的IL线,我很确定,这会导致性能问题

  3. 在vb.net中,似乎我无法il使用代码call,它总是callvirt在c#总是使用时使用call

    这一件事可能是性能问题吗?

  4. .maxstack在c#中有时候更大

    这一件事可能是性能问题吗?

最后,我试图了解如何恢复10%的速度损失.到目前为止,我一无所知

如果你想看看它是,你可以自己反编译,我用ilspy;

ZIP文件,编译版本
ChessEngine.dll
ChessEngineSharp.dll
ConsoleApplication1.exe

Kon*_*lph 8

hidebysig 只是控制重写方法中的名称查找的工作方式.

在c#中导致2个更多的IL线,我很确定,这会导致性能问题

不,它没有.应该生成相同的IL - 或等效代码.在VB中,初始化强制性的,只是如果您没有明确地执行它,编译器会为您隐式执行它.

在vb.net中,似乎我无法使用il代码来使用call,它总是使用callvirt而c#总是使用call

我很确定你的方法错了.C#将始终使用callvirt虚方法,VB支持call使用MyClass.Method()语法.

事实上,如果您的基准测试显示VB快10%,那么我怀疑您的基准测试中存在错误,仅此而已.