Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数百万对象创建的性能建议_C#_Performance_.net 3.5 - Fatal编程技术网

C# 数百万对象创建的性能建议

C# 数百万对象创建的性能建议,c#,performance,.net-3.5,C#,Performance,.net 3.5,我的代码必须生成数百万个对象来执行某些算法(将创建数百万个对象,同时销毁其中的2/3)。 我知道对象创建会导致性能问题 有人能推荐如何管理如此庞大的对象、垃圾收集等吗 谢谢。如果在您的算法中有可能,那么尝试重用对象-如果2/3被立即销毁,那么您可以尝试再次使用它们。详细说明我上面的“使它们成为值类型”评论 如果您有一个struct Foo,那么使用var storage=new Foo[1000000]来准备算法只会分配一大块内存(我假设所需的连续内存量将可用) 然后,您可以手动管理该块中的内存

我的代码必须生成数百万个对象来执行某些算法(将创建数百万个对象,同时销毁其中的2/3)。 我知道对象创建会导致性能问题

有人能推荐如何管理如此庞大的对象、垃圾收集等吗


谢谢。

如果在您的算法中有可能,那么尝试重用对象-如果2/3被立即销毁,那么您可以尝试再次使用它们。

详细说明我上面的“使它们成为值类型”评论

如果您有一个
struct Foo
,那么使用
var storage=new Foo[1000000]
来准备算法只会分配一大块内存(我假设所需的连续内存量将可用)

然后,您可以手动管理该块中的内存,以避免执行更多内存分配:

  • 记录阵列中实际使用的插槽数
  • 要“创建”一个新的
    Foo
    ,请将其放在第一个未使用的插槽中,并递增计数器
  • 要“删除”一个
    Foo
    ,请将其与上次使用的插槽中的一个进行交换,并减小计数器的值

当然,使算法与值类型和引用类型一起工作并不像将
class
更改为
struct
那么简单。但如果可行,它将允许您以一次性启动成本避开所有这些开销。

您可以在创建对象的类型上实现
IDisposable
接口。然后,您可以使用关键字实现
,并使用
范围编写涉及
对象的任何逻辑。下面的链接将给你一个公平的想法,我想说什么。希望他们能有所帮助

问候,


萨马尔

首先看看你是否可以避免创建它们。如果不能做到这一点,请查看是否可以将它们设置为值类型,这样就可以避免为每个对象单独分配内存。我建议您尽可能简单优雅地编写代码,然后开始衡量代码的性能。谁知道呢,这可能会改变我们的想法,你还不需要选择它!如果性能确实开始下降,您需要准确测量慢度的位置,并在此基础上消除瓶颈。您可以尝试避免分配许多小对象,但分配较少的大对象。如果你有非常小的对象,比如点,用C#structs来存储它们。@Jon每个对象都有int数组,数组是ref类型。如果这些对象的寿命很短,GC将有效地处理它们,它们永远不会离开第一代。您所描述的分配配置文件是函数式语言的典型配置文件,默认情况下,.NET内存管理已经为此进行了合理的调整。如果对象寿命更长,请考虑预先分配和重用它们。无论如何,任何优化都应该在分析特定实现之后进行。不,认真的基准测试表明,在存在分代垃圾收集的情况下,重用对象通常比不重用对象更昂贵。也就是说,如果您必须在数据结构中保存对对象的引用。@经过jmg测试,除了内存使用之外,我没有得到任何时间上的好处。@garik:只是为了确保我和其他人不会误解您的意思,您测试了重用对象,但它没有给您带来任何性能好处?@jmg,因为要执行其他操作来管理重用,而且这些操作比创建要耗费更多的时间。否则,应该重构此代码以执行更轻量级的重用。谢谢你,Jmg。直觉上我理解它应该更快。这可能会起作用,但会迫使@garik自己做一些复杂的内存管理=>大量复杂的错误代码。我想看看.NETGC是否可以在没有进一步帮助的情况下处理它。只有当你知道这是必须的事实时才进行性能优化。@Elad:内存管理总结为三行,我不认为它很复杂。这个建议源于这样一个事实,即内置于现代高级语言中的通用内存分配器(与GC无关)由于各种原因而出了名地慢。慢+数百万次呼叫=糟糕的配方。我被纠正了。非常感谢。尽管如此,在实践中出现性能问题之前,我不会开始寻找解决方案,不管复杂与否。