基础才是重中之重~Dictionary<K,V>里V的设计决定的性能

简介:

字典对象Dictionary<K,V>我们经常会用到,而在大数据环境下,字典使用不当可能引起性能问题,严重的可能引起内在的溢出!

  • 字典的值建议为简单类型,反正使用Tuple<T>
  • 字典的键在查找时,时间复杂度为O(1),性能不会有任何问题,所以不要愿望它

下面代码是对500万的字典进行测试,首先赋值,然后取出一个随机机,性能在毫秒级

    static void Draw()
        {
            int count = 5000000;
            Console.WriteLine("test:{0} feeds", count);

            List<GoldCoinInfo> list = new List<GoldCoinInfo>();
            list.Add(new GoldCoinInfo { Id = 100, GoldValue = 5, LeftCount = count, TotalCount = count });
            var dic = new Dictionary<int, int>();
            int _index = 0;
            Stopwatch sw = new Stopwatch();
            sw.Restart();
            foreach (var gold in list)
            {
                for (int j = 0; j < gold.LeftCount; j++)
                {
                    dic.Add(_index, gold.Id);
                    _index++;
                }
            }
            sw.Stop();
            Console.WriteLine("step1:{0} ms", sw.ElapsedMilliseconds);
            sw.Restart();
            var prizeIndex2 = GenerateRandom(dic.Keys.Max(), 1).FirstOrDefault();
            Console.WriteLine("step3:{0} ms,value:{1}", sw.ElapsedMilliseconds, dic[prizeIndex2]);
            sw.Stop();
        }

测试结果

而如果value使用了tuple<t>类型,那性能就一落千丈了!

       var dic = new Dictionary<int, Tuple<int, int>>();
            int _index = 0;
            Stopwatch sw = new Stopwatch();
            sw.Restart();
            foreach (var gold in list)
            {
                for (int j = 0; j < gold.LeftCount; j++)
                {
                    dic.Add(_index, new Tuple<int, int>(gold.Id, gold.GoldValue));
                    _index++;
                }
            }

在取随机机时,我们有时使用NewId()这试,但这种开销依然很大,不建议大家使用,这种只适合在特定的场合用,如EF对IQueryable结果集动态随机数时,代码如下

   /// <summary>
    /// sql函数的扩展类
    /// </summary>
    public static class SqlFunctionExtensions
    {

        #region 功能方法
        /// <summary>
        /// 在linq to entity中使用SqlServer.NEWID函数
        /// </summary>
        public static Guid NewId()
        {
            return Guid.NewGuid();
        }
        #endregion

        #region 扩展方法
        /// <summary>
        /// 随机排序扩展方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="source"></param>
        /// <returns></returns>
        public static IQueryable<T> OrderByNewId<T>(this IEnumerable<T> source)
        {
            return source.AsQueryable().OrderBy(d => NewId());
        }
        #endregion

    }

对技术的研究我们在继续,有时,模棱两可是不行的!

有时,应该较较真!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:基础才是重中之重~Dictionary<K,V>里V的设计决定的性能,如需转载请自行联系原博主。

目录
相关文章
Dictionary<string,object>性能之测试
添加二百万记录时间 16秒 用键查询值的平均时间,0MS 内存使用 150M 代码: /**//* * Created by 邹健 * Date: 2008-2-14 * Time: 10:21 *  *  */namespace test{    using System;    using System.
706 0
|
9月前
|
存储 Swift
在Swift编程语言中,字典(Dictionary)
在Swift编程语言中,字典(Dictionary)
100 3
|
存储 Java Python
多重字典(Multi-Level Dictionary)
多重字典(Multi-Level Dictionary)是一种将多个字典组合在一起的数据结构,用于解决需要在多个维度上查找数据的问题。多重字典可以看作是一个嵌套的字典,每个字典都可以作为其他字典的键。 使用多重字典的场景:
195 3
|
9月前
|
存储 缓存 数据库连接
Python基础教程——字典(Dictionary)
Python基础教程——字典(Dictionary)
|
8月前
|
存储 Python 容器
|
8月前
|
Python 存储 容器
Python 字典(Dictionary)
Python 字典(Dictionary)
|
9月前
|
开发者 Python
【Python 基础】递推式构造字典(dictionary comprehension)
【5月更文挑战第8天】【Python 基础】递推式构造字典(dictionary comprehension)
|
9月前
|
存储 数据处理 Python
Python中的字典(Dictionary)类型:深入解析与应用
Python中的字典(Dictionary)类型:深入解析与应用
96 0