zoukankan      html  css  js  c++  java
  • Dictionary vs List 效率

    话说Dictionary的效率比List的高?

    为什么高呢?这个大家可以百度下。

    当然,我也并不是完全认同。然后后了测试,反正结果是……

    其实在很多情况下是根据不同的使用环境来选择使用。

    例如:List<int> 和 Dictionary<int,int>

    就拿这两个的添加和数据遍历或者是查找单一数据体

    当循环遍历查找1500次,发现list的速度降低了很多。

    可以发现for循环查找的效率随次数增加而递减。那么我也很好奇,为什么会这样子捏?List一次的Find和1000次的Find会有这么大的效率之差?初步猜测是由于List的for循环引起。

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ListVsDictionary
    {
        class Program
        {
            static void Main(string[] args)
            {
                Stopwatch watch1 = new Stopwatch();
                Stopwatch watch2 = new Stopwatch();
                Dictionary<int, Baga> dic = new Dictionary<int, Baga>();
                List<Baga> list = new List<Baga>();
                Console.WriteLine("Add Function:");
                watch1.Start();
                for (int i = 0; i < 9000; i++)
                {
                    dic.Add(i, new Baga(i, i, 8));
                }
                Console.WriteLine("Dic: 	" + watch1.Elapsed);
                watch1.Stop();
                watch2.Start();
                for (int i = 0; i < 9000; i++)
                {
                    list.Add(new Baga(i, i, 8));
                }
                Console.WriteLine("List: 	" + watch2.Elapsed);
                watch2.Stop();
    
                Console.WriteLine("For Function:");
                watch1.Start();
                foreach (var item in dic)
                {
                    var dd = item.Value.ToString();
                }
                Console.WriteLine("Dic: 	" + watch1.Elapsed);
                watch1.Stop();
                watch2.Start();
                foreach (var item in list)
                {
                    var dd = item;
                }
                Console.WriteLine("List: 	" + watch2.Elapsed);
                watch2.Stop();
    
    
                Console.WriteLine("Search Function:");
                watch1.Start();
                Baga idVal1 = new Baga();
                dic.TryGetValue(99, out idVal1);
                Console.WriteLine("Dic: 	" + watch1.Elapsed);
                watch1.Stop();
    
                watch2.Start();
                list.Find(x => x.Id == 99);
                Console.WriteLine("List: 	" + watch2.Elapsed);
                watch2.Stop();
    
                Console.WriteLine("For Search Function:");
                watch1.Start();
                Baga idVal = new Baga();
                for (int i = 0; i < 1500; i++)
                {
                    var getDic = dic.TryGetValue(999, out idVal);
                }
                Console.WriteLine("Dic: 	" + watch1.Elapsed);
                watch1.Stop();
    
                watch2.Start();
                for (int i = 0; i < 1500; i++)
                {
                    var getList = list.Find(x => x.Id == 999);
                }
                Console.WriteLine("List: 	" + watch2.Elapsed);
                watch2.Stop();
    
    
            }
    
    
        }
        public class Baga
        {
            public Baga() { }
            #region 初始化
            public Baga(int id, int num, int type)
            {
                this.Id = id;
                this.Num = num;
                this.Type = type;
                this.Name = "asdfffffffffffffffffffffffffffffasdfffffffffffffffffff";
            }
            #endregion
    
            public int Id { get; set; }
            public int Num { get; set; }
            public int Type { get; set; }
    
            public string Name { get; set; }
            public int FriendsToken { get; private set; }
            public int Energy { get; private set; }
            public int MaxEnergy { get; private set; }
        }
    }

    最后,给出MSDN上的建议:

             1.如果需要非常快地添加、删除和查找项目,而且不关心集合中项目的顺序,那么首先应该考虑使用 System.Collections.Generic.Dictionary<TKey, TValue>(或者您正在使用 .NET Framework 1.x,可以考虑 Hashtable)。三个基本操作(添加、删除和包含)都可快速操作,即使集合包含上百万的项目。

             2.如果您的使用模式很少需要删除和大量添加,而重要的是保持集合的顺序,那么您仍然可以选择 List<T>。虽然查找速度可能比较慢(因为在搜索目标项目时需要遍历基础数组),但可以保证集合会保持特定的顺序。

             3.您可以选择 Queue<T> 实现先进先出 (FIFO) 顺序或 Stack<T> 实现后进先出 (LIFO) 顺序。虽然 Queue<T> 和 Stack<T> 都支持枚举集合中的所有项目,但前者只支持在末尾插入和从开头删除,而后者只支持从开头插入和删除。

             4.如果需要在实现快速插入的同时保持顺序,那么使用新的 LinkedList<T> 集合可帮助您提高性能。与 List<T> 不同,LinkedList<T> 是作为动态分配的对象链实现。与 List<T> 相比,在集合中间插入对象只需要更新两个连接和添加新项目。从性能的角度来看,链接列表的缺点是垃圾收集器会增加其活动,因为它必须遍历整个列表以确保没有对象没有被释放。另外,由于每个节点相关的开销以及每个节点在内存中的位置等原因,大的链接列表可能会出现性能问题。虽然将项目插入到 LinkedList<T> 的实际操作比在 List<T> 中插入要快得多,但是找到要插入新值的特定位置仍需遍历列表并找到正确的位置。

    我们还可以参考下:http://www.cnblogs.com/qinersky902/p/4999970.html

  • 相关阅读:
    VS2010 自动跳过代码现象
    Reverse Linked List II 【纠结逆序!!!】
    Intersection of Two Linked Lists
    Linked List Cycle II
    Remove Nth Node From End of List 【另一个技巧,指针的指针】
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Remove Duplicates from Sorted List
    Linked List Cycle
    Dungeon Game
  • 原文地址:https://www.cnblogs.com/annkiny/p/7755227.html
Copyright © 2011-2022 走看看