2012-04-20 8 views
9

मैं शुद्ध http://www.coderanch.com/t/201836/Performance/java/Hashtable-vs-Hashmap पर एक एल्गोरिथ्म भर में आया और यहपूर्वनिर्धारित क्षमता के साथ HashMaps तेजी

public class MapTest{ 
    static int sizeOfTrial = 100000; 
    static String[] keys = new String[sizeOfTrial]; 
    static String[] vals = new String[sizeOfTrial]; 

    public static void main(String[] args) { 
     //init sizeOfTrial key/value pairs 
     for (int i=0; i < sizeOfTrial; i++){ 
      String s1 = "key"+ i; 
      String s2 = "val"+ i; 
      keys[i] = s1; 
      vals[i] = s2; 
     } 
     test(new TreeMap(), "TreeMap"); 
     test(new Hashtable(), "Hashtable"); 
     test(new HashMap(), "HashMap"); 
     test(new Hashtable(200000), "Hashtable presized"); 
     test(new HashMap(200000), "HashMap presized"); 
    } 

    public static void test(Map tm, String name){ 
    long t1 = System.currentTimeMillis(); 
    for (int i=0; i < sizeOfTrial; i++){ 
     tm.put(keys[i],vals[i]); 
    } 
    for (int i=0; i < sizeOfTrial; i++){ 
     tm.get(keys[i]); 
    } 
    long t2 = System.currentTimeMillis(); 
    System.out.println("total time for " + name + ": " + (t2-t1)); 
    } 
} 

परीक्षण करने का फैसला कर रहे हैं और मैं निम्नलिखित परिणाम

total time for TreeMap: 1744 
total time for Hashtable: 446 
total time for HashMap: 234 
total time for Hashtable presized: 209 
total time for HashMap presized: 196 

मिला इस JVM निर्भर है और मनमाने ढंग से है या यह वास्तव में तेजी से पहुंच और भंडारण का समय प्रदान करता है?

उत्तर

10

किसी भी कंटेनर-प्रकार वर्ग के अपेक्षित आकार को पूर्वनिर्धारित करना तेजी से संग्रहण समय प्रदान करेगा क्योंकि भंडारण को अक्सर रनटाइम पर गतिशील रूप से फिर से आवंटित नहीं किया जाना चाहिए। आम तौर पर बैकिंग स्टोरेज कुछ प्रकार की सरणी होती है, और जब आप उपलब्ध क्षमता से आगे जाते हैं, तो सरणी को एक नई बड़ी सरणी में कॉपी करना होता है। यह एक महंगा ऑपरेशन है जो कई बार हो सकता है यदि आप बड़ी संख्या में ऑब्जेक्ट्स को एक कंटेनर में स्टोर करते हैं जो बहुत छोटी क्षमता से शुरू होता है।

मानचित्र से पढ़ने का प्रदर्शन किसी भी तरह से प्रभावित नहीं होना चाहिए। tm.get भाग से अलग से tm.put भाग के समय आप इसे बेहतर प्रदर्शन कर सकते हैं।


संपादित: आगे इस बिंदु को वर्णन करने के लिए, मैं कोड समय tm.put के लिए अलग से tm.get से संशोधित किया। यहाँ मेरी मशीन पर परिणाम हैं:

total time for TreeMap tm.put: 159 
total time for TreeMap tm.get: 74 
total time for Hashtable tm.put: 20 
total time for Hashtable tm.get: 10 
total time for HashMap tm.put: 42 
total time for HashMap tm.get: 5 
total time for Hashtable presized tm.put: 11 
total time for Hashtable presized tm.get: 9 
total time for HashMap presized tm.put: 6 
total time for HashMap presized tm.get: 4 

सूचना है कि Hashtable नियमित रूप से और tm.put के लिए presized के बीच अंतर का एक कारक है ~ 2। SI12ilarly, HashMap नियमित और निर्धारित के बीच का अंतर भंडारण के लिए ~ 7 का एक कारक है। हालांकि, पढ़ने पक्ष को देखते हुए दोनों Hashtable और Hashmap (Hashtable के लिए 10 ms बनाम 9 ms, और 5 ms बनाम HashMap के लिए 4 ms) दोनों ही मामलों में tm.get के लिए लगभग एक ही समय है। यह भी ध्यान दें कि निर्धारित मामले में, कुल मिलाकर कुल राशि के बारे में मोटे तौर पर लेना और प्राप्त करना।

+3

यह केवल सत्य है यदि पूर्वनिर्धारित आकार पार नहीं किया गया है। यदि यह है तो पूर्वनिर्धारित एक प्रतिलिपि भी करेगा। – twain249

+0

@ twain249: सच है। "अक्सर के रूप में" शब्दों के साथ स्पष्ट। – mellamokb

+0

न केवल पुनर्प्राप्ति के बारे में बल्कि पुरानी कुंजी के खिलाफ नए मूल्यों को संग्रहीत करने के बारे में .. क्या यह उस परिस्थिति में तेज़ी से होगा ?? – Nav

संबंधित मुद्दे