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();
    
            }
        }
    }
    
  • 相关阅读:
    Ubuntu下安装、激活并配置Pycharm
    高分辨率下firefox字体和界面自动放大的问题
    Java如何根据IP获取当前定位
    WebSocket介绍和一个简单的聊天室
    java注解处理
    TCP/IP协议三次握手与四次握手流程解析
    mybatis如何做分页处理
    xshell学习笔记
    正交表生成工具 PICT 成对组合覆盖 收藏
    Ready api groovy script 参数化
  • 原文地址:https://www.cnblogs.com/Stay627/p/14923028.html
Copyright © 2011-2022 走看看