1.测试使用ToList():
private static void TestToListPerformance()
{
Stopwatch sw = new Stopwatch();
List<int> arrList = new List<int>();
for (var i = 0; i < 20000000; i++)
{
arrList.Add(i);
}
sw.Start();
var query = arrList.Where(p => p > 10).ToList();
sw.Stop();
Console.WriteLine("使用ToList()方法构造数据:消耗{0}毫秒", sw.ElapsedMilliseconds);
sw.Restart();
foreach (var v in query)
{
}
sw.Stop();
Console.WriteLine("使用ToList()方法查询:消耗{0}毫秒", sw.ElapsedMilliseconds);
Console.WriteLine();
}
2.测试不使用ToList()方法:
private static void TestNoToList()
{
Stopwatch sw = new Stopwatch();
List<int> arrList2 = new List<int>();
for (var i = 0; i < 20000000; i++)
{
arrList2.Add(i);
}
sw.Start();
var query = arrList2.Where(x=>x>10);
sw.Stop();
Console.WriteLine("不使用ToList()方法构造数据:消耗{0}毫秒", sw.ElapsedMilliseconds);
sw.Restart();
foreach (var v in query)
{
}
sw.Stop();
Console.WriteLine("不使用ToList()方法查询:消耗{0}毫秒", sw.ElapsedMilliseconds);
Console.WriteLine();
}
测试截图:
可以看到,使用ToList()方法时,当执行到ToList()方法是,先将查询的结果放入List中,存储在内存中,这种情况适用于将结果存储为集合,但是非常不适合查询大量的数据,查询大量的数据放入内存中,非常影响性能,大量的事件花费在把数据存入List中。
不使用ToList()方法,既是LINQ强大的延迟查询功能,在foreach语句,需要使用查询结果时,才会开始查询数据,这就是为什么消耗0毫秒的原因。
很明显,当查询大量数据时,使用ToList()会极大的损耗性能,而LINQ的延迟查询就会很快。