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

        }
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM