मेरे पास खंडख के उत्तर में जोड़ने के लिए कुछ भी नहीं है, लेकिन यहां एक त्वरित परीक्षण कार्य है। मैं इस तरह के छोटे परीक्षण लिखने के लिए चारों ओर एक स्क्रैप परियोजना रखता हूं। स्रोत को समायोजित करें अपने डेटा के कुछ प्रतिनिधि को आकार दें, और आप प्रभाव की परिमाण का एक मोटा विचार प्राप्त कर सकते हैं। जैसा कि दिखाया गया है, मैंने उनके बीच 2 का एक कारक देखा।
import java.util.ArrayList;
import java.util.Random;
public class ALTest {
public static long fill(ArrayList<Byte> al, byte[] source) {
long start = System.currentTimeMillis();
for (byte b : source) {
al.add(b);
}
return System.currentTimeMillis()-start;
}
public static void main(String[] args) {
int sourceSize = 1<<20; // 1 MB
int smallIter = 50;
int bigIter = 4;
Random r = new Random();
byte[] source = new byte[sourceSize];
for (int i = 0;i<bigIter;i++) {
r.nextBytes(source);
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>(sourceSize);
time += fill(al,source);
}
System.out.print("With: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>();
time += fill(al,source);
}
System.out.print("Without: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>();
time += fill(al,source);
}
System.out.print("Without: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>(sourceSize);
time += fill(al,source);
}
System.out.print("With: "+time+"ms");
}
System.out.println();
}
}
}
आउटपुट:
With: 401ms Without: 799ms Without: 731ms With: 347ms
With: 358ms Without: 744ms Without: 749ms With: 342ms
With: 348ms Without: 719ms Without: 739ms With: 347ms
With: 339ms Without: 734ms Without: 774ms With: 358ms
जब ArrayList की क्षमता तक पहुँच जाता है, CLR करने के लिए नव निर्मित मूल एक से मूल एक की दोहरी क्षमता और प्रतियां सभी तत्वों के साथ एक नया ArrayList बनाता है एक। इसलिए यदि आप आवश्यक आकार से संबंधित कुछ विचार रखते हैं तो आप ArrayList के आकार को पूर्व निर्धारित करके इस अतिरिक्त कार्य को सहेज सकते हैं। –
@ दीपांशु: क्या यह जावा प्रश्न नहीं है? सीएलआर तस्वीर में कैसे आया? मुझे लगता है कि आप जेवीएम मतलब था? साथ ही, आपका विवरण सही लगता है लेकिन "सीएलआर" (.Net) में, जब मैं आकार को प्रीलोकेट करता हूं तो इसमें अधिक समय लगता है। कम से कम, यह तब होता है जब मैंने 1000000 वस्तुओं पर इसका परीक्षण किया। मैंने इसे 10-15 बार परीक्षण किया और हर बार डिफॉल्ट ऐरेलिस्ट कन्स्ट्रक्टर जीता! – TCM
मैंने ऐरेलिस्ट को कहा, लेकिन यह सामान्य रूप से किसी सरणी द्वारा समर्थित संग्रह के सूची दृश्य रखने के सामान्य रूप से अवधारणा पर लागू हो सकता है। – Maverick