为什么c#的性能比VB慢
本文关键字:VB 性能比 为什么 | 更新日期: 2023-09-27 18:05:30
我有两个库,第一个是在vb.net中完成的原始库,第二个是在c#中。
做完全相同的事情。
vb.net比c#快10%,这很奇怪
所以我发现似乎是减速的原因,通过查看两者的IL
代码是(我会说接近99%的il
代码是相同的);
-
c#中的所有方法调用都有
hidebysig
,但在vb.net中没有这可能是一个性能问题吗?
-
在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,我很确定这会导致性能问题
-
在vb.net中,似乎我无法获得
il
代码使用call
,它总是使用callvirt
,而c#总是使用call
这可能是一个性能问题吗?
-
。c#
中的Maxstack有时更大这可能是一个性能问题吗?
最后,我试图理解如何恢复10%的速度损失。到目前为止我一无所知
如果你想看一下,你可以自己反编译,我用的是ilspy;
ZIP文件,编译版本
ChessEngine.dll
ChessEngineSharp.dll
ConsoleApplication1.exe
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