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();
    
            }
        }
    }
    
  • 相关阅读:
    【现代程序设计】【Homework01】
    Apache 关于 mod_rewrite 遇到 %2F或%5C (正反斜杠)等特殊符号导致URL重写失效出现404的问题
    PHP 使用CURL库IP欺骗,隐藏真实客户端IP
    php客服聊天回话系统,长连接加ajax轮询实现
    Which PHP version do I choose
    批量操作,向后台传数组
    angularjs的directive详解
    table中表头不动,表体产生滚动条
    3263232
    forEach、for+i、map的用法及区别
  • 原文地址:https://www.cnblogs.com/Stay627/p/14923028.html
Copyright © 2011-2022 走看看