为什么c#的性能比VB慢

本文关键字:VB 性能比 为什么 | 更新日期: 2023-09-27 18:05:30

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

做完全相同的事情。

vb.net比c#快10%,这很奇怪

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

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

    这可能是一个性能问题吗?

  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

    这可能是一个性能问题吗?

  4. 。c#

    中的Maxstack有时更大

    这可能是一个性能问题吗?

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

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

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

为什么c#的性能比VB慢

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

在c#中会多出2行,我很确定,这会导致性能问题

不,没有。应该生成相同的IL -或等效代码。在VB初始化中,是强制性的,如果你不显式地做,编译器会隐式地为你做。

在vb.net中,似乎我不能得到il代码使用call,它总是使用callvirt,而c#总是使用call

我敢肯定你理解错了。c#总是在虚方法上使用callvirt, VB通过使用MyClass.Method()语法来支持call

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

我已经试着运行了几次,但是我的系统上的计时并没有显示出任何特别的偏差。

我试着运行"BenchVB"answers"benchc#"测试四次,结果如下:

    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更快。至少在我的个人电脑上(四核运行在4GHz, Windows 7 x64),看起来没有什么明显的区别。

我要说的是,我的问题似乎是硬件依赖,在家里VS在工作是白天和晚上,唯一的区别是英特尔桌面cpu(家庭)VS英特尔移动cpu(工作)。(在工作中,c#比vb快…)

我希望在国内的数字会更接近/类似c#/vb