Hashtable与Dictionary比较
项目需要存储Tcp连接对象,考虑使用Hashtable或者Dictionary存储。Hashtable在查询方面有优势,Dictionary在确定类型下不需要拆箱与装箱有优势。于是,写了个demo对两个存储对象进行了插入、查询、删除、遍历的速度比较。
static Hashtable hashtable = new Hashtable(); static Dictionary<string, ConnectedClient> keyValuePairs = new Dictionary<string, ConnectedClient>(); static void Init() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for(int i = 0; i < 100000; i++) { ConnectedClient connectedClient = new ConnectedClient(new TcpClient()); hashtable.Add(i.ToString(),connectedClient); } stopwatch.Stop(); Console.WriteLine(string.Format("Hashtable插入100000耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Restart(); for (int i = 0; i < 100000; i++) { ConnectedClient connectedClient = new ConnectedClient(new TcpClient()); keyValuePairs.Add(i.ToString(), connectedClient); } stopwatch.Stop(); Console.WriteLine(string.Format("Dictionary插入100000耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Restart(); var result = (ConnectedClient)hashtable["70000"]; stopwatch.Stop(); Console.WriteLine(string.Format("Hashtable搜索一条耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Restart(); result = keyValuePairs["70000"]; stopwatch.Stop(); Console.WriteLine(string.Format("Dictionary搜索一条耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Restart(); hashtable.Add("9000000", new ConnectedClient(new TcpClient())); ; stopwatch.Stop(); Console.WriteLine(string.Format("Hashtable插入一条耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Restart(); keyValuePairs.Add("9000000", new ConnectedClient(new TcpClient())); ; stopwatch.Stop(); Console.WriteLine(string.Format("Dictionary插入一条耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Restart(); hashtable.Remove("9000000");; stopwatch.Stop(); Console.WriteLine(string.Format("Hashtable删除一条耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Restart(); keyValuePairs.Remove("9000000");; stopwatch.Stop(); Console.WriteLine(string.Format("Dictionary删除一条耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Restart(); foreach (var key in hashtable.Keys) { ((ConnectedClient)hashtable[key]).outCount--; } Console.WriteLine(string.Format("Hashtable遍历耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Stop(); stopwatch.Restart(); foreach (var key in keyValuePairs.Keys) { keyValuePairs[key].outCount--; } Console.WriteLine(string.Format("Dictionary遍历耗时{0}。", stopwatch.ElapsedTicks)); stopwatch.Stop(); Console.ReadLine(); }