C# 还有一些性能和优化问题。。。(局部变量与类变量以及迭代与递归树插入/查找操作)

C# 还有一些性能和优化问题。。。(局部变量与类变量以及迭代与递归树插入/查找操作),c#,memory,garbage-collection,C#,Memory,Garbage Collection,晚安 我有两个小问题,可能看起来很傻,但对于我现在需要做出的一些实施决策来说非常重要 1) 在性能方面,将数百次调用的函数的“工作变量”声明为(私有)类变量,而不是在每次调用中实例化它们(以避免几次不必要的分配和随之而来的内存压力以及更多的GC执行),这是否有利可图?在性能方面有什么不同吗 2) 使用迭代函数而不是递归函数对树插入/查找进行编码是否有显著的性能提升?在这种特殊情况下,一个查找最多需要160000个递归调用,与树的节点(插入也可以)一样多,因此我考虑将这些函数实现为迭代函数,而不是

晚安

我有两个小问题,可能看起来很傻,但对于我现在需要做出的一些实施决策来说非常重要

1) 在性能方面,将数百次调用的函数的“工作变量”声明为(私有)类变量,而不是在每次调用中实例化它们(以避免几次不必要的分配和随之而来的内存压力以及更多的GC执行),这是否有利可图?在性能方面有什么不同吗

2) 使用迭代函数而不是递归函数对树插入/查找进行编码是否有显著的性能提升?在这种特殊情况下,一个查找最多需要160000个递归调用,与树的节点(插入也可以)一样多,因此我考虑将这些函数实现为迭代函数,而不是递归函数

非常感谢。

1)变量不是垃圾收集的。对象是。始终在正确的范围内声明变量。在应用优化之前,使用探查器查找瓶颈并评估优化。不要过早地为了速度而放弃可维护性

2) 很可能。使用探查器。

1)将工作对象声明为私有类变量是有益的,但不像您想象的那么频繁。有几件事你必须考虑。

首先,使用私有类变量会使类本质上不具有线程安全性。除非您使用线程本地存储,否则它会带来自身的性能问题

事实往往证明,重复使用一个对象比分配一个新对象更昂贵。例如,清除一个哈希集或列表通常比分配一个新的哈希集或列表并让垃圾收集器在完成后处理它要昂贵得多

只要类实例在范围内,私有类变量就保持“在范围内”。如果您忘记清除它(即将其设置为
null
或清除集合),这可能是一个问题,因为私有变量引用的任何内容都不会被垃圾收集。以这种方式使用私有变量消除了通过使用垃圾收集器获得的许多好处

NET内存管理器针对短期对象进行了很好的优化。我发现在很少的情况下,为了避免内存分配和垃圾收集器开销,将方法级对象提升到类范围是有意义的

我将回应@dtb给出的建议:使用探查器查找瓶颈并确定潜在的优化机会。否则,您只是在黑暗中摸索,您的“优化”可能会对性能产生不利影响