gpt4 book ai didi

C#字符串实习

转载 作者:可可西里 更新时间:2023-11-01 08:54:58 25 4
gpt4 key购买 nike

我正在尝试理解字符串实习以及为什么它在我的示例中似乎不起作用。该示例的要点是显示示例 1 使用更少(更少的内存),因为它在内存中应该只有 10 个字符串。但是,在下面的代码中,两个示例使用的内存量大致相同(虚拟大小和工作集)。

请告知为什么示例 1 没有使用更少的内存?谢谢

示例 1:

        IList<string> list = new List<string>(10000);

for (int i = 0; i < 10000; i++)
{
for (int k = 0; k < 10; k++)
{
list.Add(string.Intern(k.ToString()));
}

}

Console.WriteLine("intern Done");
Console.ReadLine();

示例 2:

        IList<string> list = new List<string>(10000);

for (int i = 0; i < 10000; i++)
{
for (int k = 0; k < 10; k++)
{
list.Add(k.ToString());
}

}

Console.WriteLine("intern Done");
Console.ReadLine();

最佳答案

问题是 ToString() 仍会分配一个新字符串,然后 将其保留。如果垃圾收集器不运行以收集那些“临时”字符串,那么内存使用量将是相同的。

此外,您的字符串长度很短。 10,000 个大多数只有一个字符长的字符串是大约 20KB 的内存差异,您可能不会注意到这一点。在检查内存使用情况之前,尝试使用更长的字符串(或更多)并进行垃圾收集。

这是一个确实显示差异的示例:

class Program
{
static void Main(string[] args)
{
int n = 100000;

if (args[0] == "1")
WithIntern(n);
else
WithoutIntern(n);
}

static void WithIntern(int n)
{
var list = new List<string>(n);

for (int i = 0; i < n; i++)
{
for (int k = 0; k < 10; k++)
{
list.Add(string.Intern(new string('x', k * 1000)));
}
}

GC.Collect();
Console.WriteLine("Done.");
Console.ReadLine();
}

static void WithoutIntern(int n)
{
var list = new List<string>(n);

for (int i = 0; i < n; i++)
{
for (int k = 0; k < 10; k++)
{
list.Add(new string('x', k * 1000));
}
}

GC.Collect();
Console.WriteLine("Done.");
Console.ReadLine();
}
}

关于C#字符串实习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2506588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com