SORU
29 EYLÜL 2008, PAZARTESİ


Liste performans HashSet vs

HashSet<T> Genel sınıfın bir arama performansı List<T> jenerik sınıfının daha yüksek olduğu açıktır. Sadece karşılaştırmak List<T> sınıfta doğrusal yaklaşım ile karma tabanlı anahtarı.

Ancak karma bir anahtar hesaplamak olabilir kendisi bazı CPU döngüleri al, öğelerin küçük bir miktar için doğrusal arama HashSet<T> gerçek bir alternatif olabilir.

Benim sorum: nerede başabaş?

Senaryo (ve adil) basitleştirmek için List<T> sınıfının elementi bir öğeyi tanımlamak için 7 ** yöntemi kullanan varsayalım.

CEVAP
26 Mayıs 2012, CUMARTESİ


Bir sürü insan bir kere hız aslında HashSet<T> List<T>, yenecek ama ne yaptığınızı bağlıdır ilgilendiren boyutunu almak olduğunu söylüyor.

Hadi sadece ortalama 5 öğe olacak List<T> olduğunu varsayalım. Eğer tek bir öğe ya da her döngüsü eklendi kaldırılırsa döngüleri çok sayıda, daha iyi List<T> kullanıyor olabilirsiniz.

Benim makinede bu bir test yaptım, ve, iyi, List<T> bir avantaj elde etmek için çok çok küçük olmalı. Kısa dizeleri listesi için avantajı boyutu sonra Boyutu 20 sonra nesneler için 5, gitti.

1 item LIST strs time: 617ms
1 item HASHSET strs time: 1332ms

2 item LIST strs time: 781ms
2 item HASHSET strs time: 1354ms

3 item LIST strs time: 950ms
3 item HASHSET strs time: 1405ms

4 item LIST strs time: 1126ms
4 item HASHSET strs time: 1441ms

5 item LIST strs time: 1370ms
5 item HASHSET strs time: 1452ms

6 item LIST strs time: 1481ms
6 item HASHSET strs time: 1418ms

7 item LIST strs time: 1581ms
7 item HASHSET strs time: 1464ms

8 item LIST strs time: 1726ms
8 item HASHSET strs time: 1398ms

9 item LIST strs time: 1901ms
9 item HASHSET strs time: 1433ms

1 item LIST objs time: 614ms
1 item HASHSET objs time: 1993ms

4 item LIST objs time: 837ms
4 item HASHSET objs time: 1914ms

7 item LIST objs time: 1070ms
7 item HASHSET objs time: 1900ms

10 item LIST objs time: 1267ms
10 item HASHSET objs time: 1904ms

13 item LIST objs time: 1494ms
13 item HASHSET objs time: 1893ms

16 item LIST objs time: 1695ms
16 item HASHSET objs time: 1879ms

19 item LIST objs time: 1902ms
19 item HASHSET objs time: 1950ms

22 item LIST objs time: 2136ms
22 item HASHSET objs time: 1893ms

25 item LIST objs time: 2357ms
25 item HASHSET objs time: 1826ms

28 item LIST objs time: 2555ms
28 item HASHSET objs time: 1865ms

31 item LIST objs time: 2755ms
31 item HASHSET objs time: 1963ms

34 item LIST objs time: 3025ms
34 item HASHSET objs time: 1874ms

37 item LIST objs time: 3195ms
37 item HASHSET objs time: 1958ms

40 item LIST objs time: 3401ms
40 item HASHSET objs time: 1855ms

43 item LIST objs time: 3618ms
43 item HASHSET objs time: 1869ms

46 item LIST objs time: 3883ms
46 item HASHSET objs time: 2046ms

49 item LIST objs time: 4218ms
49 item HASHSET objs time: 1873ms

Burada verileri bir grafik olarak görüntülenir:

enter image description here

İşte kod:

static void Main(string[] args)
{
    int times = 10000000;


    for (int listSize = 1; listSize < 10; listSize  )
    {
        List<string> list = new List<string>();
        HashSet<string> hashset = new HashSet<string>();

        for (int i = 0; i < listSize; i  )
        {
            list.Add("string"   i.ToString());
            hashset.Add("string"   i.ToString());
        }

        Stopwatch timer = new Stopwatch();
        timer.Start();
        for (int i = 0; i < times; i  )
        {
            list.Remove("string0");
            list.Add("string0");
        }
        timer.Stop();
        Console.WriteLine(listSize.ToString()   " item LIST strs time: "   timer.ElapsedMilliseconds.ToString()   "ms");


        timer = new Stopwatch();
        timer.Start();
        for (int i = 0; i < times; i  )
        {
            hashset.Remove("string0");
            hashset.Add("string0");
        }
        timer.Stop();
        Console.WriteLine(listSize.ToString()   " item HASHSET strs time: "   timer.ElapsedMilliseconds.ToString()   "ms");
        Console.WriteLine();
    }


    for (int listSize = 1; listSize < 50; listSize =3)
    {
        List<object> list = new List<object>();
        HashSet<object> hashset = new HashSet<object>();

        for (int i = 0; i < listSize; i  )
        {
            list.Add(new object());
            hashset.Add(new object());
        }

        object objToAddRem = list[0];

        Stopwatch timer = new Stopwatch();
        timer.Start();
        for (int i = 0; i < times; i  )
        {
            list.Remove(objToAddRem);
            list.Add(objToAddRem);
        }
        timer.Stop();
        Console.WriteLine(listSize.ToString()   " item LIST objs time: "   timer.ElapsedMilliseconds.ToString()   "ms");



        timer = new Stopwatch();
        timer.Start();
        for (int i = 0; i < times; i  )
        {
            hashset.Remove(objToAddRem);
            hashset.Add(objToAddRem);
        }
        timer.Stop();
        Console.WriteLine(listSize.ToString()   " item HASHSET objs time: "   timer.ElapsedMilliseconds.ToString()   "ms");
        Console.WriteLine();
    }

    Console.ReadLine();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • case LianLi

    case LianLi

    28 Mayıs 2010
  • CMTelly

    CMTelly

    2 Mayıs 2007
  • Kanaal van Dj0fifty

    Kanaal van D

    28 EKİM 2011