zoukankan      html  css  js  c++  java
  • 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();
    
            }
        }
    }
    
  • 相关阅读:
    mac 个人账户环境变量位置
    版本控制工具Git
    xmind导图用例转换为表格用例
    Mysql清空表(truncate)与删除表中数据(delete)的区别
    log4j日志级别及使用规范
    洛谷 P3807 【模板】卢卡斯定理
    jmeter环境配置与java环境配置
    NOI2020乱搞记
    Re:ゼロから始める文化課生活
    阅读书单
  • 原文地址:https://www.cnblogs.com/Stay627/p/14923028.html
Copyright © 2011-2022 走看看