C# DataTable与List读写性能测试
Posted 太菜以至特困且毫无头绪之萌新水货咚咚锵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# DataTable与List读写性能测试相关的知识,希望对你有一定的参考价值。
最近看见同事在写需要非常多次遍历的算法,发现DataTable的读取速度竟然吊打List
于是我做了个3千万条数据的读写性能测试
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
Console.WriteLine("---3kw数据读写测试---");
DataTable dt = new DataTable();
List<object> list = new List<object>();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 30000000; i++)
dt.Rows.Add();
sw.Stop();
Console.WriteLine($"DataTable 空行写入 {sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = 0; i < 30000000; i++)
list.Add(new object());
sw.Stop();
Console.WriteLine($"List<T> 空行写入 {sw.ElapsedMilliseconds} ms");
sw.Reset();
foreach (var item in dt.Rows) { }
sw.Stop();
Console.WriteLine($"DataTable 读取 {sw.ElapsedMilliseconds} ms");
sw.Restart();
foreach (var item in list) { }
sw.Stop();
Console.WriteLine($"List<T> 读取 {sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = dt.Rows.Count - 1; i >= 0; i--)
dt.Rows.RemoveAt(i);
sw.Stop();
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");
Console.ReadLine();
}
}
}
可以看到在写入和删除时,List性能是碾压DataTable的,
但是List内部实现是基于数组的数据结构,理论上位移下标的速度是高于链表等数据结构,为什么读取速度却被DataTable吊打呢?
原因是因为DataTable在索引下标时是使用的红黑二叉树实现,
博主曾看过一篇红黑二叉树的性能测试,大概是1亿条数据索引到某条数据只需要计算21次,
大家有兴趣可以搜索一下红黑二叉树,数据结构与算法还是很重要的必修课。
以上是关于C# DataTable与List读写性能测试的主要内容,如果未能解决你的问题,请参考以下文章