• 使用Linq对Hashtable和Dictionary<T,T>查询的效率比较


    近期做版本迭代任务,有一个在店铺头部展示店主所在的城市名称和省份名称的需求,店主信息表中保存了店主所在的城市Id和省份Id,由于原有业务复杂,要尽量减少Sql执行时间,所以不考虑join城市地区详细表。于是考虑在集合类中处理。

    是选择Hashtable还是Dictionary<T,T>呢?于是做了一个测试,代码清单如下:

     1 /// <summary>
     2     /// 城市信息
     3     /// </summary>
     4     public class CityInfo
     5     {
     6         public string CityName { get; set; }
     7         public string ProvinceName { get; set; }
     8     }
     9     /// <summary>
    10     /// 数据仓库和查找方法
    11     /// </summary>
    12     public static  class Respository
    13     {
    14 
    15         
    16         public static Hashtable Retrieve()
    17         {
    18             Hashtable data = new Hashtable();
    19             for (int i = 0; i < 100000; i++)
    20             {
    21              data.Add(i+1,"data"+i);
    22             }
    23             return data;
    24         }
    25         public static string Find(Hashtable data,int id)
    26         {
    27             var query = from item in data.Cast<DictionaryEntry>() where (int)item.Key == id select item.Value.ToString();
    28             return query.First();
    29         }
    30 
    31 
    32         public static Dictionary<int, string> SecondRetrieve()
    33 
    34         {
    35             Dictionary<int,string> data = new Dictionary<int,string>();
    36             for (int i = 0; i < 100000; i++)
    37             {
    38                 data.Add(i + 1, "data" + i);
    39             }
    40             return data;
    41         }
    42 
    43         public static string SecondFind(Dictionary<int, string> data, int id)
    44         {
    45             var query = from item in data where (int)item.Key == id select item.Value;
    46             return query.First();
    47         }
    48 
    49         public static Dictionary<int, CityInfo> ThridRetrieve()
    50         {
    51             Dictionary<int, CityInfo> data = new Dictionary<int, CityInfo>();
    52             for (int i = 0; i < 100000; i++)
    53             {
    54                 data.Add(i + 1,  new CityInfo { CityName="CityName"+i, ProvinceName="ProvinceName"+i  });
    55             }
    56             return data;
    57         }
    58 
    59         public static CityInfo ThridFind(Dictionary<int, CityInfo> data, int id)
    60         {
    61             var query = from item in data where (int)item.Key == id select item.Value;
    62             return query.First();
    63         }
    64     }

    测试入口:

     1 static void Main(string[] args)
     2         {
     3             {
     4                 Stopwatch stwtotal = new Stopwatch();
     5                 stwtotal.Start();
     6                 Hashtable data = Respository.Retrieve();
     7                 for (int i = 1; i < 20; i++)
     8                 {
     9                     Stopwatch stw = new Stopwatch();
    10                     stw.Start();
    11                     Random r = new Random();
    12                     string result = Respository.Find(data, r.Next(1, 1000)*i);
    13                     stw.Stop();
    14                     Console.WriteLine(result + "   FirstFindExecuteTime:" + stw.Elapsed.TotalMilliseconds+"ms");
    15                 }
    16                 stwtotal.Stop();
    17                 Console.WriteLine("测试数据总时间" + stwtotal.Elapsed.TotalMilliseconds + "ms");
    18             }
    19             {
    20                 Stopwatch stwtotal = new Stopwatch();
    21                 stwtotal.Start();
    22                 Dictionary<int, string> data = Respository.SecondRetrieve();
    23                 for (int i = 1; i < 20; i++)
    24                 {
    25                     Stopwatch stw = new Stopwatch();
    26                     stw.Start();
    27                     Random r = new Random();
    28                     string result = Respository.SecondFind(data, r.Next(1, 1000)*i);
    29                     stw.Stop();
    30                     Console.WriteLine(result + "   SecondFindExecuteTime:" + stw.Elapsed.TotalMilliseconds+"ms");
    31                 }
    32                 stwtotal.Stop();
    33                 Console.WriteLine("测试数据总时间:" + stwtotal.Elapsed.TotalMilliseconds + "ms");
    34             }
    35             {
    36                 Stopwatch stwtotal = new Stopwatch();
    37                 stwtotal.Start();
    38                 Dictionary<int, CityInfo> data = Respository.ThridRetrieve();
    39                 for (int i = 1; i < 20; i++)
    40                 {
    41                     Stopwatch stw = new Stopwatch();
    42                     stw.Start();
    43                     Random r = new Random();
    44                     CityInfo result = Respository.ThridFind(data, r.Next(1, 1000) * i);
    45                     stw.Stop();
    46                     Console.WriteLine(result.CityName + "   ThridFindExecuteTime:" + stw.Elapsed.TotalMilliseconds + "ms");
    47                 }
    48                 stwtotal.Stop();
    49                 Console.WriteLine("真实数据初始化到查找结束总时间:" + stwtotal.Elapsed.TotalMilliseconds + "ms");
    50             }
    51             Console.ReadKey();
    52         }

    测试结论:Dictionary<T,T>明显优于Hashtable

    截图如下:

    1.Hashtable

    2Dictionary<int,string>

    3,Dictionary<int,CityInfo>

  • 相关阅读:
    spring boot 在windows下安装为service(转)
    win7安装Anaconda+TensorFlow+配置PyCharm(转)
    IDEA中Spring boot配置热部署无效问题解决方式(转)
    WEB后台--基于Token的WEB后台登录认证机制(转)
    selenium之使用chrome浏览器测试(附chromedriver与chrome的对应关系表)(转)
    开源巨献:Google最热门60款开源项目(转)
    反射获取一个方法中的参数名(不是类型)(转)
    ELK原理与介绍(转)
    Linux下Redis的安装和部署(转)
    webpack+ES6+less开发环境搭建(转)
  • 原文地址:https://www.cnblogs.com/sunzhuokai/p/3547386.html
Copyright © 2020-2023  润新知