结论:
- List性能要优于DataGrid,两者的源码实现都是基于数组数据结构
- 在增删DataTable时,会维护一张索引表,性能与List差距很大
- 在遍历DataTable时,会存在object {System.Data.DataRow} 装箱操作
- DataTable索引时基于RBTree实现(红黑二叉树)
题外话:
- 当我们对读写性能都有要求时,建议使用HashTable、Dictionary(哈希表是由数组+链表组成)
- Dictionary某些性能要强于HashTable(强类型声明无需拆装箱)
![image](https://img2020.cnblogs.com/blog/1310644/202107/1310644-20210709164221130-1360172207.png)
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
Console.WriteLine("---100w数据读写测试---");
DataTable dt = new DataTable();
List<object> list = new List<object>();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
dt.Rows.Add();
sw.Stop();
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine($"DataTable 空行写入 {sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = 0; i < 1000000; i++)
list.Add(new object());
sw.Stop();
Console.WriteLine($"List<T> 空行写入 {sw.ElapsedMilliseconds} ms");
sw.Restart();
foreach (var item in dt.Rows) { }
sw.Stop();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"DataTable 遍历 {sw.ElapsedMilliseconds} ms");
sw.Restart();
foreach (var item in list) { }
sw.Stop();
Console.WriteLine($"List<T> 遍历 {sw.ElapsedMilliseconds} ms");
var dtEnumerable = dt.AsEnumerable();
sw.Restart();
dtEnumerable.FirstOrDefault(p => p != null);
sw.Stop();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"DataTable Linq Search {sw.ElapsedMilliseconds} ms");
sw.Restart();
list.FirstOrDefault(p => p != null);
Console.WriteLine($"List<T> Linq Search {sw.ElapsedMilliseconds} ms");
sw.Stop();
sw.Restart();
for (int i = dt.Rows.Count - 1; i >= 0; i--)
dt.Rows.RemoveAt(i);
sw.Stop();
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"DataTable 删除 {sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = list.Count - 1; i >= 0; i--)
list.RemoveAt(i);
sw.Stop();
Console.WriteLine($"List<T> 删除 {sw.ElapsedMilliseconds} ms");
object obj = 1;
Console.ReadLine();
}
}
}