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();
    
            }
        }
    }
    
  • 相关阅读:
    拖拽模块move2
    拖拽模块move1
    String类和StringBuilder
    你真的会二分查找吗
    C++中关于new及动态内存分配的思考
    【转】Github 上传代码
    HDU4801·二阶魔方
    POJ2676,HDU4069解决数独的两种实现:DFS、DLX
    读书笔记
    SpringBoot-------实现多数据源Demo
  • 原文地址:https://www.cnblogs.com/Stay627/p/14923028.html
Copyright © 2011-2022 走看看