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();
    
            }
        }
    }
    
  • 相关阅读:
    Kubelet 会做些什么
    k8s apiserver 源码阅读笔记
    robotframework环境安装
    Hper-V卸载
    Hyper-V安装虚拟机
    git下载/上传文件提示:git did not exit cleanly
    jmeter使用csv传参进行并发测试验证
    jenkins启动
    win7系统中 python2、python3安装后再安装插件时遇到的问题
    Base.py最基层的一些方法的封装--自己整理的一些小内容
  • 原文地址:https://www.cnblogs.com/Stay627/p/14923028.html
Copyright © 2011-2022 走看看