基础才是重中之重~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 }
对技术的研究我们在继续,有时,模棱两可是不行的!
有时,应该较较真!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2015-04-11 MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法
2014-04-11 MVVM架构~knockoutjs系列之验证信息自定义输出