字典对象Dictionary<K,V>我们经常会用到,而在大数据环境下,字典使用不当可能引起性能问题,严重的可能引起内在的溢出!
- 字典的值建议为简单类型,反正使用Tuple<T>
- 字典的键在查找时,时间复杂度为O(1),性能不会有任何问题,所以不要愿望它
下面代码是对500万的字典进行测试,首先赋值,然后取出一个随机机,性能在毫秒级
static void Draw()
{
int count = ;
Console.WriteLine("test:{0} feeds", count); List<GoldCoinInfo> list = new List<GoldCoinInfo>();
list.Add(new GoldCoinInfo { Id = , GoldValue = , LeftCount = count, TotalCount = count });
var dic = new Dictionary<int, int>();
int _index = ;
Stopwatch sw = new Stopwatch();
sw.Restart();
foreach (var gold in list)
{
for (int j = ; 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(), ).FirstOrDefault();
Console.WriteLine("step3:{0} ms,value:{1}", sw.ElapsedMilliseconds, dic[prizeIndex2]);
sw.Stop();
}
测试结果
aaarticlea/png;base64,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" alt="" />
而如果value使用了tuple<t>类型,那性能就一落千丈了!
var dic = new Dictionary<int, Tuple<int, int>>();
int _index = ;
Stopwatch sw = new Stopwatch();
sw.Restart();
foreach (var gold in list)
{
for (int j = ; j < gold.LeftCount; j++)
{
dic.Add(_index, new Tuple<int, int>(gold.Id, gold.GoldValue));
_index++;
}
}
aaarticlea/png;base64,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" alt="" />
在取随机机时,我们有时使用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 }
对技术的研究我们在继续,有时,模棱两可是不行的!
有时,应该较较真!