c# List.FindAll和for的性能对比

来源:互联网 发布:家庭装修设计软件 编辑:程序博客网 时间:2024/05/20 06:52

List.FindAll的效率竟然比for循环还差
这里写图片描述

以上是baidu出来的一篇文章,让我惊诧不已,因为在AI模块我已经使用了很多FindAll。但是,上文的结论是真的吗?我在上文代码基础上增加了多次测试的代码:

        static void Main(string[] args)        {            Test(1);            Test(1);            Test(10);            Test(100);            Test(1000);        }        static void Test(int count)        {            Console.WriteLine("【 count = {0} 】", count);            Random rand = new Random();            List<int> list = new List<int>();            for (int i = 0; i < 100; i++)            {                list.Add(rand.Next(10));            }            Stopwatch watch = new Stopwatch();            //用findall            long time = 0;            for (int j = 0; j < count; j++)            {                list.Clear();                for (int i = 0; i < 100; i++)                {                    list.Add(rand.Next(10));                }                watch.Reset();                watch.Start();                List<int> resultfindall = null;                resultfindall = list.FindAll((i) => { return i == 5; });                watch.Stop();                time += watch.Elapsed.Ticks;            }            Console.WriteLine("findall:" + time);            //用for循环            List<int> resultfor = null;            time = 0;            for (int j = 0; j < count; j++)            {                list.Clear();                for (int i = 0; i < 100; i++)                {                    list.Add(rand.Next(10));                }                watch.Reset();                watch.Start();                resultfor = new List<int>(100);                for (int i = 0; i < list.Count; i++)                {                    if (list[i] == 5)                    {                        resultfor.Add(list[i]);                    }                }                watch.Stop();                time += watch.Elapsed.Ticks;            }            Console.WriteLine("for:" + time);        }    }

得到了如下结果:

.Net2.0, visual studio 执行1,1,10, 100,1000次:
这里写图片描述
.Net4.1, visual studio 执行1,1,10, 100,1000次:
这里写图片描述
Unity 先预处理再执行1000次:
这里写图片描述
Unity 先预处理再执行 10 次
这里写图片描述
Unity 先预处理再执行 1 次
这里写图片描述

我的测试程序表明:无论windows平台还是unity平台,List.FindAll的效率并非如前文所说“比for循环差五六十倍”。事实是,因为要初始化算法现场,进程第一次调用List.FindAll的耗时比for循环长五六十倍。但是,第一次之后的调用List.FindAll和for循环的性能差异是非常小的,可以忽略。

原创粉丝点击