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