SORU
14 Temmuz 2015, Salı


Neden bir HashMap daha hızlı bir Nesne oluşturma daha yaratıyor[]?

Denedim inşa kendim Göster artırmak performans için özel bir ortam, ve fark ettim ki çok ilginç bir şey: Oluşturma new Hashmap<Integer,String>(2000) ve daha fazlası) new Object[2000] - olursa olsun hangi düzen Ben Bu komutları çalıştırmak. Bu bana oldukça kafa karıştırıcı, esp. Hashmap kurucu içerdiğinden, 6**, this göre. Benim testbench ile yanlış bir şey var mı?

public static void test(int amm){ //amm=1_000_000
    Map<Integer,String> m1 = null;
    Object[] arr = null;

    long time = System.nanoTime();
    for(int i = 0; i < amm; i  ){
        m1 = new HashMap<Integer, String>(2000);
    }
    System.out.println("m1: "   (System.nanoTime() - time)); //m1: 70_455_065

    time = System.nanoTime();
    for(int i = 0; i < amm; i  ){
        arr = new Object[2000];
    }
    System.out.println("arr: "   (System.nanoTime() - time)); //arr: 1_322_473_803
}

Başka bir bilgisayarda test sonuçlarını görmek isterim. HashMap oluşturma Object[] bir oluşturma'den 10 kat daha hızlı neden hiçbir ipucu var.

CEVAP
14 Temmuz 2015, Salı


Eğer HashMap, uygulanması bakarsanız yapıcı gibi görünüyor:

public HashMap(int initialCapacity, float loadFactor) {
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal initial capacity: "  
                                           initialCapacity);
    if (initialCapacity > MAXIMUM_CAPACITY)
        initialCapacity = MAXIMUM_CAPACITY;
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new IllegalArgumentException("Illegal load factor: "  
                                           loadFactor);

    this.loadFactor = loadFactor;
    threshold = initialCapacity;
    init();
}

Ve init() gibi görünüyor:

/**
 * Initialization hook for subclasses. This method is called
 * in all constructors and pseudo-constructors (clone, readObject)
 * after HashMap has been initialized but before any entries have
 * been inserted.  (In the absence of this method, readObject would
 * require explicit knowledge of subclasses.)
 */
void init() {
}

initialCapacity aslında bir dizi oluşturmak için kullanılan almaz. Nerede kullanılıyor mu? put() yöntemi bak.

public V put(K key, V value) {
    if (table == EMPTY_TABLE) {
        inflateTable(threshold);
    }
    // hidden
} 

Bir koyun yaparken, dizinin aslında oluşturulur. inflateTable() göstermedim ama bazı matematik ve başlatır dizi yapar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • The Weavers of Eternity Paracord Tutorials

    The Weavers

    1 Ocak 2014
  • WHZGUD2

    WHZGUD2

    21 EYLÜL 2011