यद्यपि ArrayList का उपयोग करने के प्रस्ताव के जवाब सबसे परिदृश्य में समझ में आते हैं, वास्तव में प्रदर्शन के वास्तविक प्रश्न का उत्तर नहीं दिया गया है।
कुछ चीजें हैं जो आप एक सरणी के साथ कर सकते हैं:
- इसे बनाओ
- एक आइटम सेट करें
- एक आइटम मिलता है
- क्लोन / इसे कॉपी करें
सामान्य निष्कर्ष
यद्यपि एक ArrayList (मेरी मशीन पर प्रति कॉल 1 और 3 नैनोसेकंड) पर कुछ ऑपरेशन मिलते हैं और सेट होते हैं , लेकिन किसी भी गैर-गहन उपयोग के लिए एक सरणी बनाम ArrayList का उपयोग करने के लिए बहुत कम ओवरहेड है। हालाँकि कुछ बातों का ध्यान रखना चाहिए:
- एक सूची पर संचालन का आकार बदलना (जब कॉल करना
list.add(...)
) महंगा हो और किसी को संभव होने पर पर्याप्त स्तर पर प्रारंभिक क्षमता निर्धारित करने का प्रयास करना चाहिए (ध्यान दें कि एक सरणी का उपयोग करते समय एक ही समस्या उत्पन्न होती है)
- जब आदिमों के साथ काम कर रहे हैं, सरणियां काफी तेज हो सकती हैं क्योंकि वे कई मुक्केबाजी / अनबॉक्सिंग रूपांतरणों से बचने की अनुमति देंगे
- एक ऐसा एप्लिकेशन जो केवल ArrayList में मान प्राप्त करता है / सेट करता है (बहुत सामान्य नहीं!) एक सरणी पर स्विच करके 25% से अधिक का प्रदर्शन लाभ देख सकता है
विस्तृत परिणाम
यहाँ उन परिणामों के लिए मापी गई है, जो एक मानक x86 डेस्कटॉप मशीन पर JDK 7 के साथ jmh बेंचमार्किंग लाइब्रेरी (नैनोसेकंड में) का उपयोग करके उन तीन ऑपरेशनों के लिए मापा जाता है । ध्यान दें कि परीक्षण में यह सुनिश्चित करने के लिए कि परिणाम समान हैं, ArrayList का आकार कभी बदल नहीं सकता बेंचमार्क कोड यहां उपलब्ध है ।
ऐरे / एरियरलिस्ट क्रिएशन
मैंने 4 परीक्षण किए, निम्नलिखित कथनों को निष्पादित करना:
- createArray1:
Integer[] array = new Integer[1];
- createList1:
List<Integer> list = new ArrayList<> (1);
- createArray10000:
Integer[] array = new Integer[10000];
- createList10000:
List<Integer> list = new ArrayList<> (10000);
परिणाम (प्रति कॉल में नैनोसेकंड, 95% आत्मविश्वास):
a.p.g.a.ArrayVsList.CreateArray1 [10.933, 11.097]
a.p.g.a.ArrayVsList.CreateList1 [10.799, 11.046]
a.p.g.a.ArrayVsList.CreateArray10000 [394.899, 404.034]
a.p.g.a.ArrayVsList.CreateList10000 [396.706, 401.266]
निष्कर्ष: कोई ध्यान देने योग्य अंतर नहीं ।
ऑपरेशन करवाएं
मैंने 2 परीक्षण किए, निम्नलिखित कथनों को निष्पादित करना:
- getList:
return list.get(0);
- getArray:
return array[0];
परिणाम (प्रति कॉल में नैनोसेकंड, 95% आत्मविश्वास):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
निष्कर्ष: एक सरणी से प्राप्त करना एक ArrayList से प्राप्त करने की तुलना में लगभग 25% तेज है, हालांकि अंतर केवल एक नैनोसेकंड के आदेश पर है।
संचालन सेट करें
मैंने 2 परीक्षण किए, निम्नलिखित कथनों को निष्पादित करना:
- सूची सेट करें:
list.set(0, value);
- setArray:
array[0] = value;
परिणाम (प्रति कॉल नैनोसेकंड में):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
निष्कर्ष: सरणियों पर सेट ऑपरेशन सूची की तुलना में लगभग 40% तेज हैं , लेकिन, जैसा कि मिलता है, प्रत्येक सेट ऑपरेशन में कुछ नैनोसेकंड लगते हैं - इसलिए 1 सेकंड तक पहुंचने के अंतर के लिए, किसी को सूची / सरणी सैकड़ों में आइटम सेट करने की आवश्यकता होगी लाखों बार!
क्लोन / कॉपी
ArrayList की कॉपी कंस्ट्रक्टर को Arrays.copyOf
ऐसे प्रदर्शन के लिए प्रत्यायोजित करता है जो सरणी कॉपी के समान है (किसी सरणी को कॉपी करके clone
, Arrays.copyOf
या System.arrayCopy
कोई भौतिक अंतर प्रदर्शन-वार नहीं बनाता है )।