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
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.
Hızlı eğer string sadece rakam varsa k...
Sadece eğer bir özel durum olup olmadı...
Hızlı eğer bir nesnenin Temel Veri olu...
Nasıl olursa NSDictionary veya bir NSM...
Neden gcc eğer hız yerine BOYUTU için ...