【发布时间】:2014-07-16 10:31:56
【问题描述】:
我刚搬到的一个项目中有以下代码,它在我们的团队中引发了一场争论,这是否是正确的方法:
public void Method()
{
var reusableList = new List<string>();
for (int i = 0; i < 100000000; i++)
{
var result = HelperMethod(i, reusableList);
}
}
private static object HelperMethod(int someObject, List<string> something)
{
something.Clear();
//do something with the list
something.Add(someObject.ToString());
return something[0];
}
方法“Method”多次使用helper方法循环处理一些数据(这里的代码当然不是真正的代码......)并将可重用列表传递给helper方法以减少内存目的和性能目的。 在方法“方法”中没有使用该列表(这会降低代码的可读性),但是一遍又一遍地创建它会降低性能并增加内存消耗,这里最好的方法是什么?
【问题讨论】:
-
在提出问题时,请注意格式化代码 - 只需多花几秒钟的时间,可读性就会大不相同。
-
“一遍又一遍地创建它会降低性能并增加内存消耗” - 您是否证实是这种情况?请注意,您最终会得到更少的对象,但它们会更持久。垃圾收集器非常擅长处理短寿命的对象。
-
你测试过代码吗?您担心什么性能受到影响。我的建议是不要尝试优化代码段,除非您确定它会导致问题。这种创建和删除
List<string>的操作不太可能成为您代码的瓶颈... -
这里失去可读性的成本远远超过实现的性能提升 - 这可能非常小,因为创建
List实际上并不是那么繁重的操作。 -
我想我必须添加一些东西——当我第一次在代码中看到这种模式时,我很震惊,因为它违背了我所知道的一切,但是在进行内存测试时,我们发现它减少了内存,因为它是 1持久列表与创建几百万个列表,这些列表稍后会被垃圾收集。此代码是较大代码的一部分,该代码需要非常快且内存占用少。很难衡量这种优化对系统的整体影响,而且孤立的测试并不能很好地显示整个应用程序会发生什么。
标签: c# performance memory