twe*_*ypi 33 c# performance xna new-operator
在C#中使用new关键字的性能成本是多少?我特别提到了与游戏开发有关的问题,我知道在C++中,每个更新周期都是新手,这是一个肯定的禁忌.这同样适用于C#吗?我正在使用XNA并开发移动设备.只是真的问一个优化问题.
Jon*_*eet 35
成本分为三个部分new:
在没有在主代码中创建任何新对象的情况下,很难习惯性地使用C#...尽管我敢说尽可能重用对象是可行的.尝试抓住一些真实的设备,看看你的游戏表现如何.
我当然同意在编程时通常要避免像这样的微优化,但它更适合游戏循环而不是其他地方 - 因为很明显游戏对即使是小的暂停也非常敏感.虽然由于GC成本的原因,它会随着时间的推移而分散,因此很难判断使用更多对象的成本.
分配器和垃圾收集器在.NET中相当不错,虽然它可能在设备上更简单(Windows Phone 7,我假设)?特别是,我不确定Compact Framework CLR(WP7使用的是否具有)是否具有分代GC.
Rei*_*aka 19
C#中的分配实际上比在C++中更快.它只涉及增加堆指针并返回该指针.通常,对象newed在C#中比在C++中更常出现,因为在字符串之类的东西中有更多的不变性.
正如其他人所指出的,真正的野兽是垃圾收集器,这有点难以描述.尽管如此,即使GCing在大多数情况下也是如此,但速度要快delete于C++ - 只是你无法预测它何时会发生.
.NET团队中的人物Rico Mariani的一些提示:http://msdn.microsoft.com/en-us/library/ms973837.aspx
它有点陈旧,GC上有一些改进,但大部分信息仍然相关.
我应该补充说,XNA/Compact Framework垃圾收集器比x86版本稍慢,以便在内存性能上权衡CPU,所以你应该注意这一点.
编辑
我忘了提及,这很重要:值类型,包括结构,也使用new语法,但是它们是在堆栈而不是堆上创建的,所以除非你打包它们,否则没有GC成本.
您应始终以"最简单"的方式编码,然后测量瓶颈(如果存在).
无论如何,我永远不会用C#编写游戏.
编辑
因为它引起了怨恨,我的意思是如果 C++是一个可用的选项,我永远不会在C#中编码.这是我的想法,因为OP也标记了C++.