3

我有两个库,第一个是在 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. .maxstack 在 c# 中有时更大

    这可能是性能问题吗?

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

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

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

4

3 回答 3

8

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

这在 c# 中会导致 2 多条 IL 行,我敢肯定,这会导致性能问题

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

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

我很确定你弄错了。C#总是使用callvirt虚方法,VBcall通过使用MyClass.Method()语法来支持。

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

于 2013-03-24T19:08:56.087 回答
2

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

我尝试运行“BenchVB”和“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 更快。看起来没有任何显着差异,至少在我的 PC 上(运行在 4GHz 的四核,Windows 7 x64)。

于 2013-03-24T19:54:03.377 回答
0

我要说我的问题似乎与硬件有关,在家里和工作中是白天和黑夜,唯一的区别是英特尔桌面 cpu(家庭)和英特尔移动 cpu(工作)。(在工作中,c# 比 vb 快...)

我希望在家里这个数字在 c#/vb 之间会更接近/相似

于 2013-03-25T10:43:33.673 回答