प्रश्न (अब) बहुत सारे डेटा को संग्रहीत करने के बारे में है, जिसे intमानचित्र में आदिम प्रकारों का उपयोग करके दर्शाया जा सकता है । यहाँ कुछ उत्तर मेरी राय में बहुत भ्रामक हैं। आइए देखें क्यों।
मैंने रनटाइम और मेमोरी खपत दोनों को मापने के लिए ट्रोव से बेंचमार्क को संशोधित किया । मैंने इस बेंचमार्क में पीसीजे को भी जोड़ा , जो कि आदिम प्रकारों के लिए एक और संग्रह पुस्तकालय है (मैं इसका उपयोग बड़े पैमाने पर करता हूं)। 'आधिकारिक' ट्रावेल बेंचमार्क IntIntMaps की तुलना Java Collection से नहीं करता है Map<Integer, Integer>, शायद भंडारण Integersऔर भंडारण intsतकनीकी दृष्टिकोण से समान नहीं है। लेकिन एक उपयोगकर्ता इस तकनीकी विवरण के बारे में परवाह नहीं कर सकता है, वह intsकुशलता से डेटा का प्रतिनिधित्व करने योग्य बनाना चाहता है ।
पहले कोड का प्रासंगिक हिस्सा:
new Operation() {
private long usedMem() {
System.gc();
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
// trove
public void ours() {
long mem = usedMem();
TIntIntHashMap ours = new TIntIntHashMap(SET_SIZE);
for ( int i = dataset.size(); i-- > 0; ) {
ours.put(i, i);
}
mem = usedMem() - mem;
System.err.println("trove " + mem + " bytes");
ours.clear();
}
public void pcj() {
long mem = usedMem();
IntKeyIntMap map = new IntKeyIntOpenHashMap(SET_SIZE);
for ( int i = dataset.size(); i-- > 0; ) {
map.put(i, i);
}
mem = usedMem() - mem;
System.err.println("pcj " + mem + " bytes");
map.clear();
}
// java collections
public void theirs() {
long mem = usedMem();
Map<Integer, Integer> map = new HashMap<Integer, Integer>(SET_SIZE);
for ( int i = dataset.size(); i-- > 0; ) {
map.put(i, i);
}
mem = usedMem() - mem;
System.err.println("java " + mem + " bytes");
map.clear();
}
मुझे लगता है कि डेटा आदिम के रूप में आता है ints , जो समझदार है। लेकिन यह ऑटो-बॉक्सिंग के कारण जावा उपयोग के लिए एक रनटाइम पेनल्टी का अर्थ है, जो कि आदिम संग्रह रूपरेखाओं के लिए नेक नहीं है।
gc()WinXP पर रनटाइम परिणाम (बिना कॉल के, निश्चित रूप से) jdk1.6.0_10:
100000 पुट ऑपरेशंस में 100000 ऑपरेशन शामिल हैं
जावा संग्रह 1938 एमएस 203 एमएस
ट्रोव 234 एमएस 125 एमएस
पीसीजे 516 एमएस 94 एमएस
हालांकि यह पहले से ही कठोर लग सकता है, यह इस तरह के ढांचे का उपयोग करने का कारण नहीं है।
वजह है मेमोरी परफॉर्मेंस। 100000 intप्रविष्टियों वाले मानचित्र के परिणाम :
जावा संग्रह 6644536 और 7168840 बाइट्स के बीच दोलन करता है
ट्रोव 1853296 बाइट्स
पीसीजे 1866112 बाइट्स
जावा कलेक्शंस को प्रिमिटिव कलेक्शन फ्रेमवर्क की तुलना में मेमोरी की तीन गुना से ज्यादा जरूरत होती है। यानी आप डिस्क में आईओ का सहारा लिए बिना मेमोरी में तीन गुना अधिक डेटा रख सकते हैं, जो परिमाण द्वारा रनटाइम प्रदर्शन को कम करता है। और यह मायने रखता है। क्यों पता लगाने के लिए उच्चता पढ़ें ।
मेरे अनुभव में उच्च मेमोरी खपत जावा के साथ सबसे बड़ा प्रदर्शन मुद्दा है, जो निश्चित रूप से खराब रनटाइम प्रदर्शन के रूप में अच्छी तरह से परिणाम देता है। आदिम संग्रह चौखटे वास्तव में यहाँ मदद कर सकते हैं।
तो: नहीं, java.util जवाब नहीं है। और जावा संग्रह में "कार्यक्षमता जोड़ना" दक्षता के बारे में पूछने पर बात नहीं है। इसके अलावा आधुनिक JDK संग्रह "विशेष ट्रोव संग्रह को भी बाहर नहीं करते हैं"।
अस्वीकरण: यहाँ बेंचमार्क पूर्ण से दूर है, और न ही यह सही है। यह घर को उस बिंदु पर चलाने के लिए है, जिसे मैंने कई परियोजनाओं में अनुभव किया है। यदि आप बहुत सारे डेटा के साथ काम करते हैं तो आदिम संग्रह मछलियों के एपीआई को सहन करने के लिए पर्याप्त उपयोगी हैं ।