【发布时间】:2011-04-28 05:48:57
【问题描述】:
我正在开发一些需要极低延迟并推送大量内存的应用程序,并且正在做一些测试,例如临时分配列表与预先分配和清除列表执行。 我期待预分配内存的测试运行速度更快,但令我惊讶的是,它们实际上稍微慢了一点(当我让测试运行 10 分钟时,平均差异约为 400 毫秒)。
这是我使用的测试代码:
class Program
{
private static byte[] buffer = new byte[50];
private static List<byte[]> preAlloctedList = new List<byte[]>(500);
static void Main(string[] args)
{
for (int k = 0; k < 5; k++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
List<byte[]> list = new List<byte[]>(300);
for (int j = 0; j < 300; j++)
{
list.Add(buffer);
}
}
sw.Stop();
Console.WriteLine("#1: " + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
for (int j = 0; j < 300; j++)
{
preAlloctedList.Add(buffer);
}
preAlloctedList.Clear();
}
sw.Stop();
Console.WriteLine("#2: " + sw.Elapsed);
}
Console.ReadLine();
}
}
现在,真正有趣的是,我并排运行 perfmon 并看到以下模式,看起来与我预期的一样:
绿色 = 第 0 代系列
蓝色 = 分配的字节数/秒
红色 = % GC 时间
下面的控制台应用程序显示了 #1 和 #2 的测试运行时
所以,我的问题是,为什么测试 #1 比 #2 快?
显然,我宁愿在我的应用程序中使用 Test #2 的 perfmon 统计信息,因为基本上没有内存压力、没有 GC 收集等,但 #1 似乎稍微快一些?
List.Clear() 会带来那么多开销吗?
谢谢,
汤姆
编辑 我做了另一个测试,使用相同的设置,但在启用服务器 GC 的情况下运行应用程序,现在 #2 变得稍微快一些
【问题讨论】:
标签: .net memory garbage-collection