C#和VB.NET效率的测试,请高手给解释一下这个测试结果

yongyu2000 2002-01-12 07:56:07
我们知道在.NET中,不管用VB.NET,C++,还是C#写的程序,都会被编译成CLR可以执行的中间代码,那么如果不同的语言中做同样的事情,编译出

来的IL(中间代码)是否相同的?

我做了如下的测试,发现了一个问题。
C#写的语句编译出来的IL看上去一切正常,但VB.NET就不对了,在实际代码前后,插入了3个不应该出现的nop语句,这不是降低了VB.NET的效

率吗?

按理说,如果你写的程序在CLR上跑的话,由于中间代码的存在,VB.NET C#的效率应该是一样的(至少对于本例来说是这样的),但现在不知

为什么VB生成的中间代码会有一些不应该有的语句?

那位高手知道原因的,烦请给在下解释一下。
在下认为,CLR运行IL的时候,应该会忽略nop语句,但我不敢确定。

程序编译环境
Visual Studio .NET Beta 2,中文版
CLR version is v1.0.2914
如果那位有RC3/4的话,麻烦给测试一下,看看IL输出的语句时候还是这样
(IL语句可以IL DASM <IL Disassembler> 得到)

/////////////////////This is the Vb.NET code/////////////////////
Module Module1
Sub Main()
System.Console.WriteLine("This is VB.NET")
End Sub
End Module
/////////////////////This is the IL code of the above code/////////////////////
.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 14 (0xe)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "This is VB.NET"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: nop
IL_000d: ret
} // end of method Module1::Main


/////////////////////C# code which do the same thing like the above VB.NET code/////////////////////
namespace Test
{
class Test
{
static void Main(string[] args)
{
System.Console.WriteLine("This is C#");
}
}
}
/////////////////////The following is the IL code of C# code/////////////////////
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 11 (0xb)
.maxstack 8
IL_0000: ldstr "This is C#"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
} // end of method Test::Main
...全文
195 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqchen79 2002-01-14
  • 打赏
  • 举报
回复
这主要是VB.NET编译器的问题,在cmd下打命令vbc可以察看其版本。
yongyu2000 2002-01-13
  • 打赏
  • 举报
回复
这是我今天在 RC4 版本上到的IL输出,
.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 14 (0xe)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "This is VB"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: nop
IL_000d: ret
} // end of method Module1::Main

nop依然存在。
VS.NET 版本是7.0.9447
Framework的版本是1.0.3617
怎么获得CLR,和Compiler的版本?
Soft21 2002-01-13
  • 打赏
  • 举报
回复
大家好啊,我嘛,这里还是有高手的嘛
qqchen79 2002-01-13
  • 打赏
  • 举报
回复
重要的是VBC的版本啦:
Microsoft (R) Visual Basic.NET Compiler version 7.00.9254
for Microsoft (R) .NET CLR version 1.00.2914.16
qqchen79 2002-01-13
  • 打赏
  • 举报
回复
我的Beta2 Framework 版本是v1.0.2914,VB.NET的IL里已经没有nop指令了。
vbc test.vbs
vbc /optimize+ test.vbs
结果相同
我相信这只是Beta阶段的一点困难而已,M$最终能够从VB.NET中去掉的。

至于VB.NET和C#性能的比较,参见:
http://www.csdn.net/develop/article%5C11%5C11483.shtm
和下面我的评论。:)

Ninputer 2002-01-13
  • 打赏
  • 举报
回复
最新结果(RC5):大家的担心都是多余的,请看
Visual Basic

.method public static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 11 (0xb)
.maxstack 8
IL_0000: ldstr "This is VB.net"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
} // end of method CMain::Main

Visual C#

.method public hidebysig static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 11 (0xb)
.maxstack 1
IL_0000: ldstr "This is C#"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
} // end of method Class1::Main

完全一样!!另外一个值得注意的问题是VB会自动添加STAThread属性优化,C#却不会。这是源代码
Public Class CMain
Public Shared Sub Main()
'Output something
Console.WriteLine("This is VB.net")
End Sub
End Class

class Class1
{
[STAThread]
public static void Main()
{
Console.WriteLine("This is C#");
}
}
Ninputer 2002-01-13
  • 打赏
  • 举报
回复
这么简单的语法,多一个nop无关紧要的,这并不是执行时的本机代码。
经过我的测试,If语句,While语句VB实现得比C#好,Try语句,Select语句C#实现得比VB好。总的来说无所谓啦!
内容概要:本文深入剖析了 Cursor 编辑器中 @Codebase 功能的核心价值与底层机制,指出其作为代码库语义索引和智能上下文检索系统的本质,能够解决大型项目中 AI 编程常见的上下文割裂、依赖遗漏、风格不统一等问题。通过结构化索引、语义排序、逻辑推理与精准注入四大流程,@Codebase 可实现跨文件联动修改、全局架构理解与规范复用,支持高精度的批量修复、性能优化与架构重构。文章还提供了从索引优化、范围限定到任务拆分的完整最佳实践体系,强调需配合 .cursorignore 配置、三段式指令和分层使用策略,以避免常见误区,提升大项目 AI 编程效率与准确性。; 适合人群:具备一定项目开发经验,正在使用或希望提升 Cursor 在大型复杂项目中 AI 编程效率的研发人员、技术负责人及工程团队;; 使用场景及目标:①在十万行级项目中进行全局重构与规范统一;②实现跨模块 BUG 批量修复与性能瓶颈优化;③避免重复造轮子、代码风格冲突与依赖遗漏;④构建高效、可控、低返工率的 AI 辅助开发流程; 阅读建议:此资源聚焦于如何最大化发挥 @Codebase 的工程级能力,建议结合实际大型项目边学边练,重点掌握索引瘦身、精准注入指令与任务拆分方法,并定期刷新上下文以保持与项目同步。

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧