का प्रदर्शन मैं ArrayList
को पूर्व निर्धारित करने के लिए प्रदर्शन क्षमता को देखने की कोशिश कर रहा था, जो डिफ़ॉल्ट क्षमता के साथ चल रहा था और आवश्यकता पर विस्तार कर रहा था। जिज्ञासा के कारण। मैंने पाया कि डिफ़ॉल्ट क्षमता सरणी कोड कोड की तुलना में ~ 10% तेजी से है जो आवश्यक क्षमता के लिए सरणी शुरू करता है। जबकि मैं ~ 85 एमएस मिल अगर मैं new ArrayList<Integer>(1000000)
सूची प्रारंभ बदलने के लिए,ArrayList
public class Test {
public static void main(String[] args) {
long t1 = System.currentTimeMillis();
for(int j=0;j<10;++j) {
List<Integer> list = new ArrayList<Integer>();
for(int i=0;i<1000000;++i) {
list.add(i);
}
}
long t2 = System.currentTimeMillis();
System.out.println("Time taken: " + (t2-t1)/10.0);
}
}
मैं लगातार मेरी बॉक्स पर इस संस्करण के लिए 77 एमएस मिल ~: यहाँ कोड मैं प्रयोग किया जाता है। ऐसा क्यों है? क्या यह दूसरा रास्ता नहीं होना चाहिए? वास्तव में, प्री-इनिट के बिना सूची सादा Integer[]
का उपयोग करने से लगातार एक छोटा सा (~ 0.5-1 एमएस) तेज है। मूल रूप से, यह कहता है कि default capacity arraylist > simple array > pre-capacity-ensured arraylist
सम्मिलित प्रदर्शन में क्या है।
यह मेरे लिए बहुत अजीब है। मेरा प्रारंभिक अनुमान यह है कि इसमें स्मृति आवंटन के साथ कुछ करना है, एक बार में 1000000 इंट ब्लॉक देने जैसी कुछ धीमी गति से अधिक जगह हो रही है? क्या यह अन्य मशीनों में भी पुनरुत्पादित है? मैं jdk 1.6.0, मैक ओएस एक्स का उपयोग कर रहा हूं, ग्रहण के माध्यम से चल रहा हूं।
मैंने इसे दो अन्य वातावरण में आजमाया: -> ग्रहण के बजाए कमांड लाइन से जावा + जावैक चलाने का प्रयास किया - यहां मुझे लगातार pre-capacity-ensured arraylist > simple array > default capacity arraylist
मिल गया है।
-> मेरे लिनक्स (आरएचईएल) डेस्कटॉप पर जावा + जावैक चलाने का प्रयास किया। इस बॉक्स में 24 जीबी रैम है, जबकि मेरे लैपटॉप में केवल 8 जीबी थी। यहां, मुझे plain array >>> default capacity arraylist > pre-capacity-ensured arraylist
मिल गया है। सादा सरणी सुपर-फास्ट है, इस मामले में अन्य दो की तुलना में 2-3x तेज है।
संपादित: टिप्पणी में @ JonSkeet के सुझाव के बाद, मैं nanoTime()
, और Integer
बजाय int
इस्तेमाल किया। यह अभी भी इस मुद्दे को संबोधित नहीं करता है कि हालांकि जेआईटी गर्मजोशी पर विचार नहीं किया जा रहा है। इन परिवर्तनों के बाद, मैं लगातार देखता हूं कि सादे सरणी सभी परीक्षणों में सबसे तेज है। लेकिन उपरोक्त सभी 3 वातावरणों में मेरे लिए डिफ़ॉल्ट-क्षमता सूची की तुलना में क्षमता-सुनिश्चित सूची अभी भी 5-10% धीमी है। लेकिन कुछ उपयोगकर्ताओं को सही व्यवहार मिल रहा है, इसलिए यह एक बहुत ही विशिष्ट मामला हो सकता है।
EDIT2: यदि मैं तत्व के रूप में इंटीजर की बजाय स्ट्रिंग का उपयोग करता हूं, तो व्यवहार सही है (plain array > pre-capacity-ensured arraylist > default capacity array
)। तो मुझे लगता है कि autoboxing वास्तव में अपराधी है।
* बेंच मार्किंग के लिए एक अच्छा तरीका शुरू में, * यह है नहीं। आप जेआईटी वार्मअप समय सहित हैं, और आप 'नैनोटाइम' के बजाय 'currentTimeMillis' का उपयोग कर रहे हैं। Https://code.google.com/p/caliper/ के साथ आज़माएं - मुझे संदेह है कि आपके परीक्षण का बहुत समय मुक्केबाजी को दस लाख 'int' मानों में खर्च किया जाता है। कुछ उपयोग करने का प्रयास करें जहां आपको * प्रत्येक पुनरावृत्ति पर एक नई वस्तु बनाने की आवश्यकता नहीं है। –
बस एक सहायक युक्ति: अपना परीक्षण दो बार चलाएं, और दूसरे रन के परिणामों को देखें। वीएम ऑन डिमांड लोडिंग की वजह से पहला रन प्रायः दंडित होता है। – Kylar
मैंने बाहरी लूप को 100 पुनरावृत्तियों के लिए चलाने के लिए बदल दिया और प्रीलोकेटिंग संस्करण को लगभग दोगुनी तेजी से पाया। –