我试图了解内存分配以及如何减少它们.
我创建了以下用于测试的长长列表
var list = new List<int>(Enumerable.Range(0, 1_000_000).ToArray());
然后我循环了一遍,打印了一个像这样的字符串
for (var i = 0; i < list.Count; i++)
{
Console.WriteLine("Item # " + list[i]);
}
前一个循环产生了200多万个分配.我相信第"Item # " + list[i]
行产生了200万个分配.
**问题1**
在这种情况下,它为什么要分配200万个字符串?是否必须将list[i]
作为字符串存储在堆中,即1个分配,然后将组合的字符串存储在另一个分配中,即每个循环2个分配?
下一步,我考虑使用字符串构建器来减少分配
var builder = new StringBuilder();
for (var i = 0; i < list.Count; i++)
{
builder.Append("Item # ");
builder.Append(list[i]);
Console.WriteLine(builder.ToString());
builder.Clear();
}
上面的代码有100万个分配,是以前分配的一半.
但是,这仍然是大量的拨款.
我知道字符串在C#中是不可变的对象,每个字符串在堆中都有自己的分配.但是,有没有一种方法可以重复使用内存分配,这样我们就可以创建一个字符串,然后在该循环中反复重复使用相同的分配?在我的例子中,一旦打印了字符串,我就不再需要它了.对我来说,重用相同的分配并只更新它的值是安全的.
** 问题2** 是否可以重用内存分配来减少分配量?
**问题3** 我还可以try 哪些技巧来改善我的循环呢?