SORU
19 NİSAN 2013, Cuma


Neden eğer sözlük anahtarı varsa kontrol etmek yerine, davanın özel durumu yakalamak için hızlı değil't?

Kodu düşünün:

   // some class
   public class obj
   {
   ...
   }

   public static Dictionary<string, obj> dict = new Dictionary<string, obj>();

   public static obj FromDict1(string name)
   {
       if (dict.ContainsKey(name))
       {
           return dict[name];
       }
       return null;
   }

   public static obj FromDict2(string name)
   {
       try
       {
           return dict[name];
       }
       catch (KeyNotFoundException)
       {
           return null;
       }
   }

Ben meraklı varsa bir fark performans bu 2 fonksiyonlar, çünkü ilk kişi OLMALI daha YAVAŞ ikinci bir madde olarak bu ihtiyaçları için onay iki kez sözlük içeren bir değer iken, ikinci işlev gerek erişim sözlük yalnızca bir kez, ama hey, aslında tersi olmuş

1 000 000 değerleri için döngü (100 000 900 000 mevcut ve mevcut olmayan):

ilk fonksiyon: 306 milisaniye

ikinci işlev: 20483 milisaniye

Bu yüzden mi?

Bu soru, ikinci fonksiyonun performans 0 olmayan mevcut anahtar var diye. aslında ilkine göre biraz daha iyi olduğunu aşağıdaki açıklamalarda fark Gibi DÜZENLE: Ama sonra en azından 1 ya da daha fazla sigara varolan anahtarları, ikinci performansını hızlı bir düşüş var.

CEVAP
19 NİSAN 2013, Cuma


Bir yandan, throwing exceptions is inherently expensive, çünkü bir yığın çözülmemiş vs. olmalı.
Öte yandan, anahtar tarafından bir sözlükte bir değer erişimini hızlı, O(1) bir operasyon, çünkü ucuz.

BTW: kullanmak için bunu yapmak için doğru yolu TryGetValue

obj item;
if(!dict.TryGetValue(name, out item))
    return null;
return item;

Bu sadece bir kez yerine iki kez sözlük erişir.
Eğer gerçekten sadece eğer anahtar mevcut değilse null iade etmek isterseniz, yukarıdaki kodu daha basitleştirilmiş olabilir:

obj item;
dict.TryGetValue(name, out item);
return item;

Bu TryGetValue name ile hiçbir anahtar varsa item 10 ** ayarlar için çalışıyor.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • Huot Media

    Huot Media

    7 Mayıs 2010
  • New Scientist

    New Scientis

    27 Kasım 2006