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();
        }
    }
}


image
可以看到在写入和删除时,List性能是碾压DataTable的,
但是List内部实现是基于数组的数据结构,理论上位移下标的速度是高于链表等数据结构,为什么读取速度却被DataTable吊打呢?
原因是因为DataTable在索引下标时是使用的红黑二叉树实现,
博主曾看过一篇红黑二叉树的性能测试,大概是1亿条数据索引到某条数据只需要计算21次,
大家有兴趣可以搜索一下红黑二叉树,数据结构与算法还是很重要的必修课。

以上是关于C# DataTable与List读写性能测试的主要内容,如果未能解决你的问题,请参考以下文章

c# DataTable转List 和 List转 DataTable

C#中list转table以及table转list

ASP.NET中 datatable 和list的优劣处

c# datatable select问题

c#实现两个(DataTable)数据合并

DataTable to List<Class> 在c#中没有for循环[重复]