基礎才是重(zhong)中之重(zhong)~Dictionary<K,V>里V的設計決(jue)定的性能
字典(dian)對象Dictionary<K,V>我們經常(chang)會用到,而在大數據環境(jing)下,字典(dian)使用不(bu)當可(ke)能(neng)引起性(xing)能(neng)問(wen)題,嚴重的可(ke)能(neng)引起內(nei)在的溢(yi)出!
- 字典的值建議為簡單類型,反正使用Tuple<T>
- 字典的鍵在查找時,時間復雜度為O(1),性能不會有任何問題,所以不要愿望它
下面代碼是對500萬的字典進行(xing)測試,首先賦值,然后取(qu)出(chu)一個隨機(ji)機(ji),性(xing)能在毫秒級
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(); }
測試結果
而(er)如果value使用了(le)tuple<t>類型,那(nei)性能(neng)就一落(luo)千(qian)丈了(le)!
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++; } }
在(zai)取隨機機時,我(wo)們有時使用(yong)NewId()這試(shi),但這種開銷依然很(hen)大(da),不(bu)建議大(da)家使用(yong),這種只適(shi)合(he)在(zai)特定的場(chang)合(he)用(yong),如EF對IQueryable結(jie)果集動態隨機數時,代碼如下
/// <summary> /// sql函數(shu)的擴展類 /// </summary> public static class SqlFunctionExtensions { #region 功能方法 /// <summary> /// 在linq to entity中使用SqlServer.NEWID函數 /// </summary> public static Guid NewId() { return Guid.NewGuid(); } #endregion #region 擴展方法 /// <summary> /// 隨(sui)機排序擴展(zhan)方(fang)法 /// </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 }
對技術的(de)(de)研究我們在繼續(xu),有時,模棱兩(liang)可(ke)是不行的(de)(de)!
有時,應該較較真!