Performance issue, be cautious to use List.Contains...

1. Big difference between having contains and not having, and no overriding in PerformanceInfo:


[10-05-03 11:32:25.740][Info]Program.TestCollection(): Cost 00:00:00.0312488 ([AppName:ConsoleTest.exe])
[10-05-03 11:32:59.004][Info]Program.TestCollection(): Cost 00:00:33.3737184 ([AppName:ConsoleTest.exe])
[10-05-03 11:32:59.035][Info]Program.TestCollection(): Cost 00:00:00.0312488 ([AppName:ConsoleTest.exe])
[10-05-03 11:32:59.082][Info]Program.TestCollection(): Cost 00:00:00.0468732 ([AppName:ConsoleTest.exe])

 

 

2. Try List.Distinct or use Dictionary if we want to check Contains...

 

Sample codes below:

 

        static void Main(string[] args)

        {
            int count = 100000;
            DateTime dt0 = DateTime.Now;
            TestCollectionWithoutContains(count);
            DateTime dt1 = DateTime.Now;
            Log.Info("Cost "+ (dt1 - dt0));
            TestCollectionUsingListContains(count/10);
            DateTime dt2 = DateTime.Now;
            Log.Info("Cost " + (dt2 - dt1));
            TestCollectionUsingDicContains(count);
            DateTime dt3 = DateTime.Now;
            Log.Info("Cost " + (dt3 - dt2));
            TestCollectionUsingListDistinct(count);
            DateTime dt4 = DateTime.Now;
            Log.Info("Cost " + (dt4 - dt3));

    }


        private static void TestCollectionUsingListDistinct(int count)
        {
            List<string> list = new List<string>();
            for (int j = 0; j < count; j++)
            {
                string id = (j / 2).ToString();
                list.Add(id);
            }
            List<string> list2 = new List<string>();
            foreach (string pi in list.Distinct<string>())
            {
                list2.Add(pi);
            }
        }

        private static void TestCollectionUsingListContains(int count)
        {
            List<string> list = new List<string>();
            for (int j = 0; j < count; j++)
            {
                string id = (j/2).ToString();
                if (!list.Contains(id))
                {
                    list.Add(id);
                }
            }
        }

        private static void TestCollectionUsingDicContains(int count)
        {
            //List<PerformanceInfo> list = new List<PerformanceInfo>();
            Dictionary<string, string> list = new Dictionary<string, string>();
            for (int j = 0; j < count; j++)
            {
                string id = (j / 2).ToString();
                if (!list.ContainsKey(id))
                {
                    list.Add(id, j.ToString());
                }
            }
        }

        private static void TestCollectionWithoutContains(int count)
        {
            List<string> list = new List<string>();
            for (int j = 0; j < count; j++)
            {
                string id = (j / 2).ToString();
                list.Add(id);
            }

        }

 

 

posted on 2010-04-29 06:27  Diego  阅读(201)  评论(0编辑  收藏  举报