gpt4 book ai didi

c# - 为什么 C# 性能比 VB 慢

转载 作者:行者123 更新时间:2023-11-30 13:38:38 25 4
gpt4 key购买 nike

我有两个库,第一个是在 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# 总是使用调用

    这会是性能问题吗?

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

    这会是性能问题吗?

最后,我试图了解如何恢复 10% 的速度损失。到现在我还是一头雾水

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

ZIP file, compiled version
ChessEngine.dll
ChessEngineSharp.dll
ConsoleApplication1.exe

最佳答案

hidebysig just controls how name lookup in overridden methods works.

which in c# cause 2 more IL line which, I'm pretty sure, cause a performance issue

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

in vb.net it seem I cannot get the il code to use call, it always use callvirt while c# always use call

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

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

关于c# - 为什么 C# 性能比 VB 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15602701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com