C#中 foreach,linq,delegate集合查询的性能比较

  昨天和别人讨论了一下linq的性能,以下是简单的性能测试比较代码,

在这里解释一下,代码的执行速度计时测试不能用datetime了,不够精确。

建议用StopWatch


  class Program
    {
        static void Main(string[] args)
        {
            test();
        }

       static void test()
        {
            List<MyClass> list1 = new List<MyClass>();
            for (int i = 0; i < 10000000; i++)
            {
                MyClass aa=new MyClass();
                aa.Name = "测试数据" + i;
                aa.id = i;
                list1.Add(aa);
            }

            Stopwatch timer = new Stopwatch();


            #region for循环
            timer.Start();
            List<MyClass> list2 = new List<MyClass>();

            int count = 0;
            foreach (MyClass s in list1)
            {
                if (s.id >= 52 && s.id < 850) { list2.Add(s); }
            }
            count = list2.Count;
            timer.Stop();

            Console.Write("集合匹配数" + count + ",for循环耗时:");
            Console.WriteLine(timer.Elapsed.Ticks);
            #endregion


            #region linq
            timer = new Stopwatch();
            timer.Start();
            var list3 = list1.Where(product => product.id >= 52 && product.id < 850);
            //list1.Where(product => product.id >= 52 && product.id < 850).ToArray().Count();
            int count3 = list3.Count();
            timer.Stop();


            Console.Write("集合匹配数" + count3 + ",linq耗时:");
            Console.WriteLine(timer.Elapsed.Ticks);
            #endregion


            #region delegate
            timer = new Stopwatch();
            timer.Start();
            List<MyClass> list4 = list1.FindAll(delegate(MyClass post)
            {
                return post.id >= 52 && post.id < 850;
            });
            int count4 = list4.Count();
            timer.Stop();

            Console.Write("集合匹配数" + count4 + ",delegate耗时:");
            Console.WriteLine(timer.Elapsed.Ticks);
            #endregion


            Console.Read();  
        }

        public class MyClass
        {
            public string Name { get; set; }
            public int id { get; set; }
        }
    }

测试截图

事实说明,linq效率是比for循环要差一些,但是如果集合数据不是很大的话,差距并不明显。

建议大家还是去拥抱新技术吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值