晚安,
我有两个小问题可能看起来很愚蠢,但对于我现在需要做出的一些实施决定非常重要......
1)将性能的“工作变量”称为几百次(私有)类变量,而不是在每次调用中实例化它们(以避免几次不必要的分配,从而导致内存压力等),在性能方面是否有利可图GC执行)?它在性能方面有什么不同吗?
2)使用迭代函数而不是递归函数编码树插入/查找是否有任何显着的性能提升?在这种特殊情况下,查找最多可以占用160000个递归调用,与树的节点一样多(因为插入也可以),所以我考虑将这些函数实现为迭代,而不是递归调用。
非常感谢。
答案 0 :(得分:2)
1)变量不是垃圾收集的。对象是。始终在适当的范围内声明您的变量。使用分析器查找瓶颈并在应用优化之前评估优化。不要过早放弃速度的可维护性。
2)可能。使用分析器。
答案 1 :(得分:0)
1)可以盈利,将您的工作对象声明为私有类变量,但不像您想象的那样频繁。有几件事你需要考虑。
首先,使用私有类变量会使您的类本身不是线程安全的。除非您使用线程本地存储,否则会出现其自身的性能问题。
经常会发现,重新使用对象比分配新对象更昂贵。例如,清除Hashset或List通常比分配新的Hashset或List要昂贵得多,让垃圾收集器在你完成时让它们摆脱它。
只要类实例在范围内,私有类变量就会保留在“范围内”。如果您忘记清除它(即将其设置为null
或清除集合),这可能是一个问题,因为私有变量引用的任何内容都不会被垃圾回收。以这种方式使用私有变量消除了通过使用垃圾收集器获得的大部分好处。
.NET内存管理器针对短期对象进行了优化。我发现很少有将方法级对象提升到类范围以避免内存分配和垃圾收集器开销的情况。
我将回应@dtb给出的建议:使用分析器找到瓶颈并找出潜在的优化机会。否则你只是在黑暗中探索,你的“优化”可能会对性能产生不利影响。