• 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

  • 相关阅读:
    Mybaits-plus实战(三)
    Mybaits-plus实战(二)
    Mybaits-plus实战(一)
    面向对象的理解
    如何理解算法
    将yyyyMMdd HH:mm:ss格式的时间转换成时间类型
    泛型/dynamic/object作用
    成功之道
    ASP.NET注意事项
    Razor引擎总结
  • 原文地址:https://www.cnblogs.com/annkiny/p/7755227.html
Copyright © 2020-2023  润新知