.net中Dictionary<TKey,TValue>和Hashtable性能对比
集合测试代码:
2013年5月16日 16:39
namespace ArrayTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(WindowsAppWCFDataInterface.TraceDataServiceRun.Run());
Console.WriteLine("已经启动请输入");
Console.Read();
MyDic dic=new MyDic();
dic.Run();
MyTable table=new MyTable();
table.Run();
Console.WriteLine("OK");
Console.ReadKey();
}
}
public abstract class ArrayBase
{
protected readonly long count = 5000000;
public abstract void Add();
public abstract void Del();
public abstract void Select();
public abstract void Update();
public void Run()
{
var tr = TraceControlBLLBase.TraceDataCurrunt.Begin();
Add();
Select();
Update();
Del();
tr.End();
}
}
public class MyDic:ArrayBase
{
Dictionary<string, object> list = new Dictionary<string, object>();
public override void Add()
{
var tr=TraceControlBLLBase.TraceDataCurrunt.Begin();
for (int i = 0; i < base.count; i++)
{
list.Add(i.ToString(),new object());
}
tr.End();
}
public override void Del()
{
var tr = TraceControlBLLBase.TraceDataCurrunt.Begin();
for (int i = 0; i < base.count; i++)
{
list.Remove(i.ToString());
}
tr.End();
}
public override void Select()
{
var tr = TraceControlBLLBase.TraceDataCurrunt.Begin();
for (int i = 0; i < base.count; i++)
{
var outpu= list[i.ToString()];
}
tr.End();
}
public override void Update()
{
var tr = TraceControlBLLBase.TraceDataCurrunt.Begin();
for (int i = 0; i < base.count; i++)
{
list[i.ToString()]=new object();
}
tr.End();
}
}
public class MyTable : ArrayBase
{
Hashtable list = new Hashtable();
public override void Add()
{
var tr = TraceControlBLLBase.TraceDataCurrunt.Begin();
for (int i = 0; i < base.count; i++)
{
list.Add(i.ToString(), new object());
}
tr.End();
}
public override void Del()
{
var tr = TraceControlBLLBase.TraceDataCurrunt.Begin();
for (int i = 0; i < base.count; i++)
{
list.Remove(i.ToString());
}
tr.End();
}
public override void Select()
{
var tr = TraceControlBLLBase.TraceDataCurrunt.Begin();
for (int i = 0; i < base.count; i++)
{
var outpu = list[i.ToString()];
}
tr.End();
}
public override void Update()
{
var tr = TraceControlBLLBase.TraceDataCurrunt.Begin();
for (int i = 0; i < base.count; i++)
{
list[i.ToString()] = new object();
}
tr.End();
}
}
}
两次运行结果(时间统计)
内存统计:
当protected readonly long count = 5000000;
MyDic dic = new MyDic();
dic.Run();
使用了420-20=400MB内存
MyTable table = new MyTable();
table.Run();//390,760
使用了390-20=370MB内存
当protected readonly long count = 10000000;
MyDic dic = new MyDic();
dic.Run();
使用了820-20=800MB内存
MyTable table = new MyTable();
table.Run();//390,760
使用了760-20=740MB内存
当集合量为5000000的时候,Dic比Hashtable多使用了30MB内存
当集合量为10000000的时候,Dic比Hashtable多使用了60MB内存
也就是说,Dic一般情况下比Hashtable多使用不到10%的内存
这里多出来的内存是因为集合要预留一部分数组来存储引用类型的引用(4字节的内存地址)
如果对于值类型变量,Dic可能要比Hastable多使用更多内存(但性能壁纸Hashtable更好,因为Hashtable要对值类型进行封装操作),值类型本身越大,预留的空间也就越多。
所以一般情况系建议使用泛型字典,如果要存储大值类型结构体,则应该考虑内存增长问题,尤其是在集合内部扩容时运行所需要的3倍于存储数据的内存。