Loading

C# DataTable与List读写性能测试

结论:

  • List性能要优于DataGrid,两者的源码实现都是基于数组数据结构
  • 在增删DataTable时,会维护一张索引表,性能与List差距很大
  • 在遍历DataTable时,会存在object {System.Data.DataRow} 装箱操作
  • DataTable索引时基于RBTree实现(红黑二叉树)

题外话:

  • 当我们对读写性能都有要求时,建议使用HashTable、Dictionary(哈希表是由数组+链表组成)
  • Dictionary某些性能要强于HashTable(强类型声明无需拆装箱)

image

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

        }
    }
}
posted @ 2021-06-23 15:41  Stay627  阅读(1681)  评论(0编辑  收藏  举报