创建类实例的成本有多高?(性能考虑)

3
在C#中创建一个新的类实例是很耗费资源的吗?我指的是在unity3d中使用C#,这意味着每秒钟都要不断地调用。
一般情况下,在C++中(制作游戏时),您可能希望重复使用通过new/智能指针创建的任何内容,保留已分配的可调整大小的缓冲区/列表/fifo,并且如果代码变得性能关键,则可能希望避免使用动态内存分配(并坚持使用局部变量)。
那么,在C#中推荐的方法是什么?是否创建新的List,从函数中返回,然后“忘记”永远不再使用它是一个非常糟糕的想法?
附言:我知道有性能剖析和“过早的优化”,但在我(可能)使用错误的方法之前,我想了解该语言的通用准则。

5
编写代码,检查其是否可运行,如果面临性能问题,请尝试修复。 - Hamid Pourjam
2
我再怎么强调也不为过... 专注于你代码的正确性。就像@dotctor所说,先把它搞对,然后再考虑性能。 - spender
1
一般来说,在C#中,分配通常更快。但这只是问题的很小一部分——任何新对象都有相关成本,并且这些成本很容易让你遭受损失(在堆上拥有的对象越多,集合的频率和代价就越高)。当实际出现性能问题时再修复它。真的没有太多通用建议可以提供——这取决于它发生的频率,其中有多少数据,你有多少个替代选项......通常很容易为性能重写代码——首先测试简单版本,然后进行优化。 - Luaan
1
我不能给你具体的数字,但是对象重用(对象池)会减轻垃圾收集器的压力。这可以减少GC峰值和/或使它们更少发生。当然,我会首先寻找更有效的算法。 - Pieter Witvoet
我在此请求所有将此问题标记为“待定”的人提供“不那么宽泛”的问题表述示例。在我看来,这个问题非常具体。“C#中对象创建成本与C++中的成本相比如何?”如果有更好的提问方式,我想看看。 - SigTerm
显示剩余2条评论
1个回答

2

我记得读过Ayendy Rahien的一篇有趣的文章“在酒吧里的性能数据”

在一秒钟内你可以创建多少CLR对象?

以下是2011年的结果

在00:00:01中创建了7,715,305个对象

开玩笑。创建操作相当便宜,但GC不是。因此,虽然你可以创建很多对象,但收集起来会损害性能。所以对象重用规则也适用于C#。

我会假设(可能错了),new运算符的实现位于JIT中。

像往常一样,在需要之前避免过早优化。


不错的链接。每秒7百万个对象在2011年仍然不算令人印象深刻,但(在阅读原始博客中的评论后)看起来可能每秒能够获得2到4亿个分配,这才更像话。 - SigTerm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接