C# 传递给方法以删除对象创建的参数

C# 传递给方法以删除对象创建的参数,c#,performance,memory,C#,Performance,Memory,在我刚搬到的一个项目中,我有以下代码,它在我们的团队中引发了一场争论,这是否是正确的方法: public void Method() { var reusableList = new List<string>(); for (int i = 0; i < 100000000; i++) { var result = HelperMethod(i, reusableList); } } private static object

在我刚搬到的一个项目中,我有以下代码,它在我们的团队中引发了一场争论,这是否是正确的方法:

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];
}
public void方法()
{
var reusableList=新列表();
对于(int i=0;i<100000000;i++)
{
var结果=帮助方法(i,可重用列表);
}
}
私有静态对象帮助方法(int-someObject,List-somethod)
{
明白了吗;
//对清单做点什么
something.Add(something.ToString());
返回某物[0];
}
方法“method”多次使用helper方法运行一个循环来处理一些数据(这里的代码当然不是真正的代码…),可重用列表被传递给helper方法,以减少内存和提高性能。
这个列表在方法“method”(它降低了代码的可读性)中没有用处,但是反复创建它会降低性能并增加内存消耗,这里的最佳方法是什么

列表
在内部使用数组。如果将新项目添加到列表中,并且数组中没有剩余空间,则将分配一个双倍大小的新数组,并且当前数组中的所有对象都将复制到新数组中。这需要一些时间。这可能会产生影响,具体取决于阵列中的项目数量。特别是在添加了很多项目时。当像您那样使用列表的“共享”实例时,调用
list.Clear()
时,
list
的内部数组不会收缩。使用此实例一段时间后,您就不再有这种开销了。另一种方法是,当列表中需要很多项时,可以在构造函数中指定列表的初始容量

这意味着:理论上它更快。但我怀疑你是否真的意识到了区别


我更喜欢良好的代码可读性

首先
方法()
不会被
for
循环反复执行。如果您谈论的是
HelperMethod()
,那么反复调用它不会有任何内存问题,因为一旦执行它,它创建的所有资源(
int和List
)将被处理。

请在提问时注意设置代码的格式-只需几秒钟的努力就可以大大提高可读性。“反复创建代码将降低性能并增加内存消耗”-您是否验证了这一点?请注意,最终会得到更少的对象,但它们的持续时间更长。垃圾收集器非常擅长处理短期对象。您测试过代码吗?你担心的是什么样的表现。我的建议是不要尝试优化代码段,除非您确定它会导致问题。创建和删除
列表
的操作不太可能成为代码的瓶颈…这里失去可读性的成本远远超过实现的性能改进-这可能非常小,因为创建
列表
实际上并不是一项繁重的工作。我想我必须补充一点——当我第一次在代码中看到这种模式时,我感到震惊,因为它违背了我所知道的一切,但在进行内存测试时,我们发现它减少了内存,因为它是一个持久的列表,而不是创建几百万个稍后被垃圾收集的列表。这段代码是一段较大代码的一部分,它需要非常快且内存占用小。很难衡量这种优化对系统的整体影响,单独的测试并不能很好地显示整个应用程序将发生什么。不确定你说的“cood reaFirst”是什么意思我知道clear不会更改内部数组的大小,如果所需列表的大小大致相同,则从性能角度来看,这只会使它更有用,不是吗?对不起。修正了这个句子。同样,这要视情况而定。如果您确实需要性能,对象缓存/重用可能是一种可行的方法。