C#中"新"的性能成本?

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成本.

  • 当然,需要收集堆栈中包含*引用*的值类型; 不是因为*它可能已经死了*但因为*它包含的引用可能是活着的*.包含引用类型的堆栈分配值类型仍会为GC带来成本. (4认同)
  • 不确定手机.但是Xbox 360每1MB的分配运行一次并且是非代数的.它足够慢,你需要关心它.另一方面,Windows在大多数情况下都适合游戏开发. (2认同)

Dar*_*rov 6

新运营商本身的成本可以忽略不计.可能需要花费的成本是在自定义构造函数中进行的处理.因此,如果你在这个构造函数中有很多事情发生,那可能是个问题.


Sim*_*one 5

您应始终以"最简单"的方式编码,然后测量瓶颈(如果存在).

无论如何,我永远不会用C#编写游戏.

编辑

因为它引起了怨恨,我的意思是如果 C++是一个可用的选项,我永远不会在C#中编码.这是我的想法,因为OP也标记了C++.

  • 如果OP正在为WP7开发,那么唯一的另一个选择是VB.这是你想要的吗?!? (10认同)
  • 您不仅担心移动应用程序的瓶颈,还担心电池消耗. (2认同)