游戏开发论坛

 找回密码
 立即注册
搜索
楼主: liiir1985

.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

[复制链接]

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-12-5 21:58:00 | 显示全部楼层

Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

朋友们太好了,太精精彩了.请问.net能做到像C++一样释放资源吗?而不仅是内存.

0

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2007-12-12 20:53:00 | 显示全部楼层

Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

没有inline,没法编译时内联……
JIT的时候又是该内联的不给内联…… eg.向量运算,定义的各种operator。程序里有大量物理运算,到时候一个也不给内联。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2007-12-15 02:07:00 | 显示全部楼层

Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

啊,才看到这个贴子,发现一些小错误:

to lz:
用Ngen.exe预编译的本地镜像代码和native C++编译出来的代码还是不一样的。虽然不需要JIT,但是仍然需要CLR才能运行。
其实C#确实没有C++快,这是肯定了,毕竟程序运行时还要和CRL打交道,而C++已经是可以直接执行的机器代码了。但是C#通过JIT的编译优化和更优秀的托管堆管理,一定程序上弥补了这些额外代价的损失。

to 3楼:
你似乎完全没有明白JIT的优化指的是什么。JIT的优化指的是可以针对本地CPU,在编译时进行优化。传统程序在编译时,为了保证兼容性,通常使用最通用的指令集(比如古老的386指令集)来编译。而JIT知道CPU的具体类型,可以充分利用这些附加指令集进行编译,这样的性能提升是很可观的。

另外你说的数组越界检查,如果你不需要,是完全可以关闭的

to 5楼:
.ldc_i4确实不是汇编,虽然看起来语法很像,但IL和真正的汇编还是差别很大的,IL是独立于CPU的机器语言,IL甚至可以理解对象,能调用需方法,抛出和捕获异常,比汇编高级的多。

to 6楼:
不知道你说的准确释放资源值的是什么。对于非托管资源,你在对象失效的时候,可以调用Dispose释放所有使用的外部资源,对于托管资源,GC会帮你处理好一切,如果需要确切释放这些资源,也可以手动调用GC执行。似乎没有什么资源不能释放啊??

to 12楼:
JIT对于属性和很短的方法都会自动inline。但是如果是虚方法,为了实现多态,一般是不会inline的。另外如果你的方法很复杂自然也不会inline。据我所知,JIT的inline做的很好,并没有你说的那么差。另外,如果你不希望方法inline,可以在编写代码的时候用属性显示标注。

1

主题

102

帖子

108

积分

注册会员

Rank: 2

积分
108
QQ
发表于 2008-3-16 02:37:00 | 显示全部楼层

Re: Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇

clayman: Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

to 12楼:
JIT对于属性和很短的方法都会自动inline。但是如果是虚方法,为了实现多态,一般是不会inline的。另外如果你的方法很复杂自然也不会inline。据我所知,JIT的inline做的很好,并没有你说的那么差。另外,如果你不希望方法inline,可以在编写代码的时候用属性显示标注。

找一个struct,自己写的,.net类库里的比如Size都算。然后拿个静态方法或operator试验,里面直接return new XXX();。然后测试一下速度……再和手工内联比较一下。
static Size Test()
{
    return new Size();
}
………………
Size s;
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 9999999; i++)
    s = Test();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());

sw = Stopwatch.StartNew();
for (int i = 0; i < 9999999; i++)
    s = new Size();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());

不管struct的大小,方法有几个字节,都不会内联。

当然改成class会内联,不过比不上堆栈快(比上面struct的例子不内联还慢)。
基元类型也给inline

注:release+优化
.net 2.0 sp1

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2008-3-18 22:02:00 | 显示全部楼层

Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

运算符基本上都不会内联的……

简单的属性和构造函数内联的可能性最大

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2008-3-28 17:49:00 | 显示全部楼层

Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

恐怕是java程序员对C#鄙视的更多些,一般都认为大项目要用java,中小项目才用.net

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2008-4-4 11:15:00 | 显示全部楼层

Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

谈一下我的看法
.NET 是托管代码,架构和java一样,但是运行效率在Windows平台下高了不是一点点,其他平台没用过不知道
我不知道楼主测试的代码是什么,我用C#,C++,VB,检索一段AsciiString,效率明显是C#慢了好几倍,VB编译去掉溢出检查和C++是一样的

楼上大项目用java的原因,这个和大型机装Unix一样的,因为目前.NET只在Windows平台上应用,而Widows平台只有在PC上应用,而Unix平台下面,java是一个最方便的开发语言,如果以后Unix平台架上.NET Framework,Java估计将被逐渐淘汰了,除非他有什么新的举措,因为当前java开发的便利性与.NET相比,差了好多,而硬件需求java的开发环境都要高上许多

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-7-17 19:54:00 | 显示全部楼层

Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

java是纯虚拟执行,.net时运行时编译,java是从始至终都很慢,.net是刚运行时比较慢,运行后就不是很慢了,但是比c++慢这是没办法的,运行时当然不能离开.net,因为c#用的类库就是.net的,所以在抱怨c#比c++慢的时候也不要忘记了c#程序个头的优势。

6

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
QQ
发表于 2008-9-6 13:15:00 | 显示全部楼层

Re:.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

LZ你们公司项目是做的PC游戏还是XBOX的游戏哦?

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2008-9-9 21:56:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 09:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表