2015-01-16 13 views
16

Bir HashMap aslında O (1) performansa sahipken, bir anahtar durumu, derleyicinin bir tablo düğmesi veya arama anahtarı kullanmasına bağlı olarak O (1) veya O (log (n)) olabilir. Bir switch deyimi açıkça HashMap vs Anahtar ifadesi performansı

switch (int) { 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    default: 
} 

o zaman bir tableswitch kullanmak istiyorsunuz gibi yazılı ve eğer

Anlaşılır, standart bir HashMap üzerinde performans avantajı var. Ama ya anahtar ifadesi seyrek ise? Bu, şu iki karşılaştırmayla karşılaşacağım iki örnek olacaktır:

HashMap<Integer, String> example = new HashMap<Integer, String>() {{ 
     put(1, "a"); 
     put(10, "b"); 
     put(100, "c"); 
     put(1000, "d"); 
}}; 

.

switch (int) { 
    case 1: 
     return "a"; 
    case 10: 
     return "b"; 
    case 100: 
     return "c"; 
    case 1000: 
     return "d"; 
    default: 
     return null; 
} 

Daha fazla iş hacmi, bir arama anahtarı veya HashMap ne sağlar? HashMap'in üst kısmı, arama anahtarını erkenden bir avantaj sağlıyor mu, ancak vaka/girdi sayısı arttıkça neticede küçülüyor mu?

Edit: JMH kullanarak bazı karşılaştırmaları denedim, burada benim sonuçlarım ve kullanılan kod vardır. https://gist.github.com/mooman219/bebbdc047889c7cfe612 Siz bahsettiğiniz gibi, arama anahtarı açıklaması HashTable'dan daha iyi performans gösterdi. Hala neden hala merak ediyorum.

+1

Her performans sorusunda olduğu gibi: bunu ölçmelisiniz. http://stackoverflow.com/q/504103/139010 Sonuçlarınızı dört gözle bekliyorum ':)' –

+1

Farkı ölçmek için iyi bir varsayılan cevap vermek ... Anahtar deyiminin daha hızlı olmasını beklerim çünkü Daha az talimat gerektirecektir. C ve GCC ile, bir anahtar/elseif-zincirleri, atlama tabloları veya içeriğe bağlı olmayan bir şekilde uygulanır (örneğin, anahtarda kaç durum, dizin oluşturma vb.) –

+1

Daha az karmaşıklığa ek olarak, arama anahtarı mekanizması referans lokalitesinin önemli avantajı. Hashmap 1 olmalıdır. 2. kova dizisini ayırt etme; 3. Dizideki dizideki Node örneğinin 1'den türetilmiş dereferansı; 4. İstenen anahtara eşit olduğundan emin olmak için Düğümün Tamsayı anahtarının dereference; 5. Son olarak düğümden dönüş değerini dereference. –

cevap

18

Bu bir çok şey bağlıdır:

  1. birkaç ürün/sabit öğeler varsa. Anahtarı kullanma (en kötü durum O (n))

  2. Çok fazla öğe varsa VEYA çok fazla kod değiştirmeden gelecekteki öğeleri eklemek istediğinizde ---> Karma haritasının kullanılması (erişim süresi sabit zaman olarak kabul edilir)

  3. Sizin durumunuz için. Performans konusunda endişelenmemelisiniz çünkü her iki durum için zaman tüketimi çok düşüktür. Sadece kodunuzun okunabilirliği/sürdürülebilirliğine odaklanın. Senin durumunda

+0

Anahtarın uzunluğu da uygun. – OldCurmudgeon

+0

Anahtar ifadesi için neden birçok öğe kötü? Derleyicinin bizim için anahtar ifadelerinde optimizasyon ve ikili ağaç yaptığını duydum. – shuva

0

, kendi switch deyimi için bir ova 'int' senin HashMap için bir Integer anahtar kullanarak ve olduğundan, en iyi performans gösteren uygulama bu bölümünde geçiş sayısına sürece switch deyimi olacak Kod çok yüksektir (onlarca veya yüz binlerce).