Exemplo n.º 1
0
    void Start()
    {
        Dictionary <int, int> dic = new Dictionary <int, int>();

        for (int i = 0; i < 10000; i++)
        {
            dic.Add(i, i);
        }

        int sum = 0;

        // 88byte
        Profiler.BeginSample("values");
        foreach (var e in dic.Values)
        {
            sum += e;
        }
        Profiler.EndSample();

        // 88byte
        Profiler.BeginSample("keys");
        foreach (var k in dic.Keys)
        {
            sum += dic[k];
        }
        Profiler.EndSample();

        // 64byte
        Profiler.BeginSample("pair");
        foreach (var pair in dic)
        {
            sum += pair.Value;
        }
        Profiler.EndSample();

        // 0.5KB
        var comp = new EnumTypeComparer();

        Profiler.BeginSample("dictionary<EnumType, int>");
        Dictionary <EnumType, int> dic2 = new Dictionary <EnumType, int>(comp);

        Profiler.EndSample();

        // 488byte
        Profiler.BeginSample("dictionary<int, int>");
        Dictionary <int, int> dic1 = new Dictionary <int, int>();

        Profiler.EndSample();

        // 217.3KB
        Profiler.BeginSample("dictionary<int, int>(10000)");
        dic1 = new Dictionary <int, int>(10000);
        Profiler.EndSample();

        // 0.5KB
        Profiler.BeginSample("dictionary<int, string>");
        Dictionary <int, string> dic3 = new Dictionary <int, string>();

        Profiler.EndSample();

        // 0.5KB
        Profiler.BeginSample("dictionary<string, int>");
        var dicsi = new Dictionary <string, int>();

        Profiler.EndSample();

        // 0.6KB
        Profiler.BeginSample("dictionary<string, string>");
        Dictionary <string, string> dic4 = new Dictionary <string, string>();

        Profiler.EndSample();

        // 304.1KB
        Profiler.BeginSample("dictionary<string, string>(10000)");
        dic4 = new Dictionary <string, string>(10000);
        Profiler.EndSample();
    }
    void Start()
    {
        Dictionary <int, int> dic = new Dictionary <int, int>();

        for (int i = 0; i < 10000; i++)
        {
            dic.Add(i, i);
        }

        int sum = 0;

        // 120byte
        {
            Profiler.BeginSample("values");
            foreach (var e in dic.Values)
            {
                sum += e;
            }
            Profiler.EndSample();
        }

        // 120byte
        {
            // 72byte
            Profiler.BeginSample("keys get");
            // new KeyCollection (24byte)
            Dictionary <int, int> .KeyCollection keys = dic.Keys;
            Profiler.EndSample();

            // 48byte
            Profiler.BeginSample("keys foreach");
            foreach (int k in keys)
            {
                sum += dic[k];
            }
            Profiler.EndSample();
        }

        // 0byte
        {
            Profiler.BeginSample("keys 2");
            foreach (var k in dic.Keys)
            {
                sum += dic[k];
            }
            Profiler.EndSample();
        }

        // 96byte
        {
            Profiler.BeginSample("pair");
            foreach (var pair in dic)
            {
                sum += pair.Value;
            }
            Profiler.EndSample();
        }

        // 0byte
        {
            Profiler.BeginSample("pair 2");
            foreach (var pair in dic)
            {
                sum += pair.Value;
            }
            Profiler.EndSample();
        }

        // pairでキャッシュが生成されているため0byte
        Profiler.BeginSample("enemurator");
        using (var itr = dic.GetEnumerator())
        {
            while (itr.MoveNext())
            {
                sum += itr.Current.Value;
            }
        }
        Profiler.EndSample();

        // 80B
        var comp = new EnumTypeComparer();
        Dictionary <EnumType, int> dic2 = new Dictionary <EnumType, int>();

        Profiler.BeginSample("dictionary<EnumType, int>");
        dic2 = new Dictionary <EnumType, int>();
        Profiler.EndSample();

        // 172B
        Profiler.BeginSample("dictionary<EnumType, int>.set_item");
        for (int i = 0; i < 100; i++)
        {
            dic2[EnumType.A] = 0;
            dic2[EnumType.B] = 1;
            dic2[EnumType.C] = 2;
        }
        Profiler.EndSample();

        {
            Profiler.BeginSample("dictionary<EnumType, int>.get_item");
            for (int i = 0; i < 100; i++)
            {
                int dic2_0 = dic2[EnumType.A];
                dic2_0 += dic2[EnumType.B];
                dic2_0 += dic2[EnumType.C];
            }
            Profiler.EndSample();
        }

        {
            Profiler.BeginSample("dictionary<EnumType, int>.ContainsKey");
            for (int i = 0; i < 100; i++)
            {
                if (dic2.ContainsKey(EnumType.A))
                {
                }
            }
            Profiler.EndSample();
        }

        {
            Profiler.BeginSample("dictionary<EnumType, int> foreach");
            for (int i = 0; i < 100; i++)
            {
                foreach (var pair in dic2)
                {
                    EnumType k = pair.Key;
                    int      v = pair.Value;
                }
            }
            Profiler.EndSample();
        }

        // 80byte
        Dictionary <int, int> dic1 = new Dictionary <int, int>();

        Profiler.BeginSample("dictionary<int, int>");
        dic1 = new Dictionary <int, int>();
        Profiler.EndSample();

        // 0.8KB
        {
            Profiler.BeginSample("dictionary<string, int> x10");
            for (int i = 0; i < 10; i++)
            {
                var t = new Dictionary <string, int>();
            }
            Profiler.EndSample();
        }

        // 2.2KB
        {
            Profiler.BeginSample("dictionary<string, int>(1) x10");
            for (int i = 0; i < 10; i++)
            {
                // 80
                var t = new Dictionary <string, int>();
                // 44 + 104
                t.Add("a", i);
            }
            Profiler.EndSample();
        }

        Profiler.BeginSample("dictionary<int, int>.set_item");
        for (int i = 0; i < 100; i++)
        {
            dic1[0] = 0;
            dic1[1] = 1;
            dic1[2] = 2;
        }
        Profiler.EndSample();

        {
            Profiler.BeginSample("dictionary<int, int>.get_item");
            for (int i = 0; i < 100; i++)
            {
                int dic1_0 = dic1[0];
                dic1_0 += dic1[1];
                dic1_0 += dic1[2];
            }
            Profiler.EndSample();
        }

        // 217.3KB
        Profiler.BeginSample("dictionary<int, int>(10000)");
        dic1 = new Dictionary <int, int>(10000);
        Profiler.EndSample();

        // 0.5KB
        Profiler.BeginSample("dictionary<int, string>");
        Dictionary <int, string> dic3 = new Dictionary <int, string>();

        Profiler.EndSample();

        // 0.5KB
        Profiler.BeginSample("dictionary<string, int>");
        var dicsi = new Dictionary <string, int>();

        Profiler.EndSample();

        // 0.6KB
        Profiler.BeginSample("dictionary<string, string>");
        Dictionary <string, string> dic4 = new Dictionary <string, string>();

        Profiler.EndSample();

        // 304.1KB
        Profiler.BeginSample("dictionary<string, string>(10000)");
        dic4 = new Dictionary <string, string>(10000);
        Profiler.EndSample();

        // 234.6KB
        Profiler.BeginSample("reset dictionary (ToArray)");
        //foreach (var key in dic.Keys.to)
        {
            //	dic[key] = 0;
        }
        Profiler.EndSample();

        // 234.6KB
        Profiler.BeginSample("reset dictionary (new List)");
        foreach (var key in new List <int>(dic.Keys))
        {
            dic[key] = 0;
        }
        Profiler.EndSample();

        Profiler.BeginSample("reset dictionary (values)");

        Profiler.EndSample();

        // 96B
        {
            Profiler.BeginSample("readonly dictionary");
            var rodic = new System.Collections.ObjectModel.ReadOnlyDictionary <int, int>(dic);
            foreach (var e in rodic)
            {
                sum += e.Value;
            }
            Profiler.EndSample();
        }

        // 48B
        {
            Profiler.BeginSample("readonly dictionary 2");
            IReadOnlyDictionary <int, int> rodic = dic;
            foreach (var e in rodic)
            {
                sum += e.Value;
            }
            Profiler.EndSample();
        }

        {
            Profiler.BeginSample("readonly dictionary 3");
            IReadOnlyDictionary <int, int> rodic = dic;
            foreach (var e in rodic)
            {
                sum += e.Value;
            }
            Profiler.EndSample();
        }

        // 480byte
        {
            Profiler.BeginSample("IDictionary<int, int>");
            for (int i = 0; i < 10; i++)
            {
                IDictionary <int, int> rodic = dic;
                foreach (var e in rodic)
                {
                    sum += e.Value;
                }
            }
            Profiler.EndSample();
        }

        for (int i = 0; i < 100; i++)
        {
            dic4.Add(i.ToString(), i.ToString());
        }

        // おそらくKeyValuePairがボックス化される
        // 3.2KB
        {
            Profiler.BeginSample("IDictionary foreach");
            IDictionary idic = dic4;
            foreach (var e in idic)
            {
            }
            Profiler.EndSample();
        }

        {
            Profiler.BeginSample("Dictionary get_item");
            for (int i = 0; i < 10000; i++)
            {
                if (dic4.ContainsKey("99"))
                {
                    var s = dic4["99"];
                }
            }
            Profiler.EndSample();
        }

        {
            Profiler.BeginSample("IDictionary get_item");
            IDictionary idic = dic4;
            for (int i = 0; i < 10000; i++)
            {
                if (idic.Contains("99"))
                {
                    var s = idic["99"];
                }
            }
            Profiler.EndSample();
        }

        {
            SortedDictionary <string, string> sortedDcit = new SortedDictionary <string, string>();
            sortedDcit.Add("a", "a");
            sortedDcit.Add("b", "b");
            sortedDcit.Add("c", "c");

            foreach (var pair in sortedDcit)
            {
            }

            // 120byte
            Profiler.BeginSample("SortedDictionary foreach");
            foreach (var pair in sortedDcit)
            {
            }
            Profiler.EndSample();
        }

        {
            Profiler.BeginSample("Dictionary<string, int>.ctor");
            Dictionary <string, int> d = new Dictionary <string, int>(10000);
            Profiler.EndSample();
            for (int i = 0; i < 1000; i++)
            {
                d.Add(i.ToString(), i);
            }

            Profiler.BeginSample("Dictionary<string, int>.get");
            for (int i = 0; i < 10000; i++)
            {
                string k = "500";
                int    v = d[k];
                v += d[k];
            }
            Profiler.EndSample();
        }

        {
            Profiler.BeginSample("Dictionary<object, int>.ctor");
            Dictionary <object, int> d = new Dictionary <object, int>(10000);
            Profiler.EndSample();
            for (int i = 0; i < 1000; i++)
            {
                d.Add(i.ToString(), i);
            }

            Profiler.BeginSample("Dictionary<object, int>.get");
            for (int i = 0; i < 10000; i++)
            {
                string k = "500";
                int    v = d[k];
                v += d[k];
            }
            Profiler.EndSample();
        }
    }