基础才是重中之重~DictionaryK,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}
对技术的研究我们在继续,有时,模棱两可是不行的!
有时,应该较较真!
回到目录
基础才是重中之重~DictionaryK,V里V的设计决定的性能相关推荐
- 基础才是重中之重~再说面向接口的编程
回到目录 之前在我的文章中有对接口进行过讲解,但感觉讲的还是不够清晰,不够利针见血,这次我把面向接口的编程里,自认为比较核心的两点说一下: 接口详细介绍请看我的这篇文章 基础才是重中之重~为什么C#有 ...
- 基础才是重中之重~通过人类的生活来学习Delegate
一个人(people),在他60岁之后,就宣布进入晚年了,在这个期间要多注意身体,多体检. namespace NET基础才是重中之重{/// <summary>/// 人类/// < ...
- 基础才是重中之重~类是怎么执行的
回到目录 对于一个程序员来说,有必要知道一个概念的同时也解它的执行过程,这样对于写出更好更安全的程序是有帮助的. 大牛们不是一天就成为大牛的,而是经过一步一步的实践,不断的知识的积累才成为大牛的,呵呵 ...
- 第二十二回 基础才是重中之重~ThreadStatic静态字段在每个线程里的唯一性
static修饰符我们不会陌生,它代表静态,可以修饰你的类,方法,字段和属性等等,今天主要说一个为静态字段加ThreadStatic特性会给程序代来什么样的变化.静态字段static field,我更 ...
- 基础才是重中之重~方法override详解
回到 目录 之所以写这篇文章,完全是因为这次代码审核,这次代码审核过程当中,出现了很多我认为基础知识不够扎实的问题,所以,打算把它们记录下来,共大家分享. 方法的override,即方法的覆写或者重写 ...
- 基础才是重中之重~何为原子化操作
占占定义: 原子化操作,操作原子化,这在软件开发中经常被听到,那到底什么是操作原子化呢,其实从字面上不难理解,原子化就是一体化,整体化,原子化操作就是将多个操作组合在一起,要么这个组合一起发生,要么一 ...
- 基础才是重中之重~用好configSections让配置信息更规范
对于小型项目来说,配置信息可以通过appSettings进行配置,而如果配置信息太多,appSettings显得有些乱,而且在开发人员调用时,也不够友好,节点名称很容易写错,这时,我们有几种解决方案 ...
- 基础才是重中之重~.net中的显式事务与隐式事务
回到目录 .net中的事务可以分为显式的和稳式的,显式的就是说需要我们手动去指定事务的提交和回滚,而稳式的是.net帮助我们进行管理的,当你的事务代码段没有发生异常时,它会帮助我们进行提交,反之,进行 ...
- 基础才是重中之重~开发人员应用学会用throw
回到目录 无论是.net还是java,在开发程序时都难免会用到throw关键字,对于初学者一般会认为它与try...catch捆绑在一起,这当然是错误的,事实上,throw的一个最重要的作用就是: 让 ...
最新文章
- python查询缺失值所在位置使用scipy_python – 使用缺失值计算scipy中的成对距离
- “神人”or“闲人”?你的未来由AI与大数据决定
- 以为精通Java 线程池,看到这些误区,还是年轻了...
- 面试官让我手写一个生产者消费者模式?
- TVideoGrabber的使用(简介)
- 在LINUX环境中,哪种文件系统存储更安全?
- 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut
- Android textview 获取url,获取电话号码
- 工厂方法模式_1天1个设计模式——工厂方法模式
- SQL Server智能提示插件下载
- 在iMac上建立一个git仓库
- 【深入理解JVM笔记】什么是元数据?
- 【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 问题二方案及Python实现
- Rockchip CAN 总线
- 云里黑白第五回——联想Y430p系统迁移
- 机电和计算机专业怎么选,计算机专业怎么选城口_竟成学校
- ubuntu提示系统缺失字体:symbol、wingdings、wingdings2、wingdings3、webdings,WPS无法正确显示...
- HTML5之HTML+CSS3代码(一)
- 5 个免费在线 SQL 数据库环境,简直太方便了!
- 11选5c语言代码,11选5中“胆”存秘籍 三绝招助彩民有所斩获
热门文章
- 数据库软件安装和数据库创建的几种方法
- Open×××的Linux内核版,鬼魅的残缺 part I:The PROTOCOL
- Spring Batch_官网DEMO实现
- 问问题要量化,要具体
- Windows 2008 ×××与 CA
- 一元三次方程求解matlab_初中数学最全函数/方程【实际应用题】分类详解提升必学必练!...
- hmr webpack 不编译_一文搞懂 webpack HMR 原理
- 神经网络预测模型算法_MATLAB Elman神经网络的数据预测—电力负荷预测模型研究...
- RID枚举工具RidEnum
- Beaglebone Black开发板安装驱动